我已经阅读了与我类似的各种问题,但似乎都没有解决我的问题。
我有这样的类型:
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);
}
}
什么时候T
是一个标量,因为MyObject<int>
平等工作正常,但是当我定义类似MyObject<IEnumerable<int>>
平等的东西时失败。
原因是当 T 是IEnumerable<T>
我应该调用this.Value.SequenceEqual(other.Value)
.
使用类型检查和反射的 LOC 来处理这种差异会膨胀Equals(MyObject<T>)
(对我来说,这会导致违反 SOLID/SRP)。
我无法在 MSDN 指南中找到这个特定案例,所以如果有人已经遇到过这个问题;如果可以分享这些知识,那就太好了。
编辑:替代
对于 KISS,我想知道做类似的事情:
class MyObject<T> : IEquatable<MyObject<T>> {
private readonly IEnumerable<T> value;
// remainder omitted
}
这样实现起来Equal
就会简单很多。当我只需要一个值时,我会收集 1 个项目。显然 T 不会是可枚举的(但数据结构是私有的,所以没有问题)。