私に似たさまざまな質問を読みましたが、どれも私の問題に対処していないようです。
私はこのようなタイプを持っています:
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)
です。
この違いを処理Equals(MyObject<T>)
すると、型チェックとリフレクションの LOC が多すぎます (私にとっては、SOLID/SRP の違反につながります)。
MSDN ガイドラインでこの特定のケースを見つけることができなかったので、誰かがすでにこの問題に直面している場合は、この知識が共有できれば素晴らしいことです。
編集:代替
KISSに、私は似たようなことをしたいと思っています:
class MyObject<T> : IEquatable<MyObject<T>> {
private readonly IEnumerable<T> value;
// remainder omitted
}
このようにして、の実装はEqual
非常に簡単になります。値が 1 つだけ必要な場合は、1 つのアイテムのコレクションがあります。明らかに、 T は列挙可能ではありません (ただし、データ構造はプライベートであるため、問題はありません)。