Tôi đã đọc các câu hỏi khác nhau tương tự như của tôi nhưng không ai trong số họ có vẻ giải quyết vấn đề của tôi.Triển khai IEquatable <T> khi T có thể là IEnumerable <T>
Tôi đã một kiểu như thế này:
class MyObject<T> : IEquatable<MyObject<T>> { // no generic constraints
private readonly string otherProp;
private readonly T value;
public MyObject(string otherProp, T value)
{
this.otherProp = otherProp;
this.value = value;
}
public string OtherProp { get { return this.otherProp; } }
public T Value { get { return this.value; } }
// ...
public bool Equals(MyObject<T> other)
{
if (other == null)
{
return false;
}
return this.OtherProp.Equals(other.OtherProp) && this.Value.Equals(other.Value);
}
}
Khi T
là một vô hướng như MyObject<int>
bình đẳng hoạt động chính xác, nhưng khi tôi định nghĩa một cái gì đó giống như MyObject<IEnumerable<int>>
bình đẳng thất bại.
Lý do là khi T là IEnumerable<T>
Tôi nên gọi this.Value.SequenceEqual(other.Value)
.
Xử lý sự khác biệt này bloats Equals(MyObject<T>)
với quá LOC loại kiểm tra và phản ánh (đối với tôi, dẫn đến vi phạm SOLID/SRP).
Tôi không thể tìm thấy trường hợp cụ thể này trong nguyên tắc MSDN, vì vậy nếu có ai đó đã gặp sự cố này; nó sẽ là tuyệt vời nếu kiến thức này có thể được chia sẻ.
Edit: Alternative
Để K.I.S.S., tôi đang tự hỏi để làm một cái gì đó tương tự:
class MyObject<T> : IEquatable<MyObject<T>> {
private readonly IEnumerable<T> value;
// remainder omitted
}
Bằng cách này, thực hiện Equal
sẽ có rất nhiều đơn giản. Và khi tôi chỉ cần một giá trị tôi đã có một bộ sưu tập gồm 1 mục. Rõ ràng T sẽ không được liệt kê (nhưng cấu trúc dữ liệu là riêng tư nên không có vấn đề gì).
Nếu có thể trong trường hợp của bạn, bạn cũng có thể thêm ràng buộc chung 'trong đó T: IEquatable'. –
Guillaume
@Guillaume, tôi đã đánh giá và lý do về nó ... – jay
Để tham khảo, tôi muốn thêm những gì đi trong câu trả lời theo __Edit: Alternative__ gần với giải pháp thực sự của tôi. Tôi đang gặp phải rằng không có lý do hợp lệ để không sử dụng một 'IEnumerable' cũng khi trong hầu hết các trường hợp, tập hợp 'T' sẽ chỉ giữ một phần tử hoặc thay vì trống. Đây không phải là trường hợp, bộ sưu tập thường giữ từ một đến vài yếu tố; vì vậy tôi muốn nói rằng 'IEnumerable 'nên được _hard coded_ trong định nghĩa' MyObject 'thay vì tùy chọn được truyền như một toàn bộ thông qua kiểu tham số (tôi đang nói về việc tránh' MyObject > 'và đi cho thay thế). –
jay