リフレクションを使用して、タイプの 2 つの異なるが「等しい」インスタンスで .Equals を呼び出した結果を判断しようとしています。
私の方法は次のようになります。
public static bool TypeComparesProperties(Type t)
{
// return true if (an instance of t).Equals(a different instance of t)
// will be true if all publicly accessible properties of the instances
// are the same
}
例として:
string a = "Test";
string b = "Test";
bool areEqual = a.Equals(b); // areEqual will be true
// so:
TypeComparesProperties(typeof(string)); // should return true
ただし、与えられた:
public class MyComplexType
{
public int Id { get; set; }
public string MyString { get; set; }
}
MyComplexType a = new MyComplexType {Id = 1, MyString = "Test"};
MyComplexType b = new MyComplexType { Id = 1, MyString = "Test" };
bool areEqual = a.Equals(b); // areEqual will be false
// so:
TypeComparesProperties(typeof(MyComplexType)); // should return false
次のようにクラスに実装IEquatable<MyComplexType>
すると、代わりに true になります。
public class MyComplexType : IEquatable<MyComplexType>
{
public int Id { get; set; }
public string MyString { get; set; }
public bool Equals(MyComplexType other)
{
return (Id.Equals(other.Id) && MyString.Equals(other.MyString));
}
}
リフレクションを使用して 2 つのインスタンスをインスタンス化し、すべてのプロパティを適切に型指定された既定値に設定することで、おそらくそれを実行できると思います。しかし、それは多くの作業と多くのオーバーヘッドであり、型に空のコンストラクターがないと問題が発生すると思います。
他のアイデアはありますか?
編集:
人々は私の意図に混乱しているようです。謝罪します。うまくいけば、これが明確になるでしょう:
2 つのオブジェクトをその能力を最大限に比較するメソッドがあります。単純に .Equals() を呼び出すだけでは十分ではありません。
- オブジェクトは値型になるか、適切な方法で IEquatable を実装し、真の応答が得られます。すごい!
- オブジェクトはすべて同じプロパティを持ち、「等しい」場合がありますが、それらは異なるインスタンスであるため、誤った応答が返されます。 この false が、オブジェクトが「等しくない」ためなのか、それともインスタンスが異なるだけなのかはわかりません。
したがって、私の考えでは、比較方法は次のようにする必要があります。
Equals
オブジェクト タイプを調べて、そのメソッドが同じパブリック プロパティを持つ 2 つの異なるインスタンスに対して true を返すかどうかを確認します。- その場合は、メソッドを呼び出して
Equals
結果を返します - そうでない場合は、すべてのプロパティとフィールドを見て、できる限り比較して、それらが等しいかどうかを判断してください
ここで、手順 3 にスキップできることは理解していますが、必要かどうかを事前に判断する方法があれば、時間を節約できます。
編集2:
いくつかの理由でこれを閉じます。
- 話せば話すほど、自分が求めたことは自分が本当にやりたかったことではないことに気付く
- やりたいと思っても、近道はありません。以前の編集については、とにかくステップ 3 にスキップする必要があります。
ご意見をお寄せいただきありがとうございます。