強く型付けされたビジネスオブジェクトを匿名型にマップするいくつかのコードがあります。コードはJSONにシリアル化され、APIを介して公開されます。Object.Equals()は、異なるアセンブリからインスタンス化されたときに、同一の匿名型に対してfalseを返すのはなぜですか?
私のソリューションを別のプロジェクトに再構成した後、私のテストのいくつかが失敗し始めました。私は少し掘り下げましたが、Object.Equals
は、別のアセンブリのコードから返される匿名型では動作が異なることが判明しました。なぜか、それを回避するために何ができるのか分かりません。
https://github.com/dylanbeattie/AnonymousTypeEqualityに完全な復帰コードがありますが、実際に壊れているビットは以下のとおりです。このコードは、テストプロジェクトである:
[TestFixture]
public class Tests {
[Test]
public void BothInline() {
var a = new { name = "test", value = 123 };
var b = new { name = "test", value = 123 };
Assert.That(Object.Equals(a,b)); // passes
}
[Test]
public void FromLocalMethod() {
var a = new { name = "test", value = 123 };
var b = MakeObject("test", 123);
Assert.That(Object.Equals(a, b)); // passes
}
[Test]
public void FromOtherNamespace() {
var a = new { name = "test", value = 123 };
var b = OtherNamespaceClass.MakeObject("test", 123);
Assert.That(Object.Equals(a, b)); // passes
}
[Test]
public void FromOtherClass() {
var a = new { name = "test", value = 123 };
var b = OtherClass.MakeObject("test", 123);
/* This is the test that fails, and I cannot work out why */
Assert.That(Object.Equals(a, b));
}
private object MakeObject(string name, int value) {
return new { name, value };
}
}
、その後、別のクラスライブラリは、これだけを含む溶液中にあります:
namespace OtherClasses {
public static class OtherClass {
public static object MakeObject(string name, int value) {
return new { name, value };
}
}
}
MSDNによると、「同じ匿名型の2つのインスタンスは、は、それらのプロパティがすべて等しい場合にのみ等しくなります。 (私の強調) - 2つのインスタンスが比較のために同じの匿名タイプであるかどうかを制御するものは何ですか?私の2つのインスタンスは等しいハッシュコードを持っていて、どちらも<>f__AnonymousType0`2[System.String,System.Int32]
と思われますが、匿名型の等価性は完全修飾型名を考慮しなければならないと思います。誰でもこれがどのように実装されているかについての明確なソース/リンクを得ていますか?
私はちょっとしばらく噛むことに問題はありません...あなたが一口を誘発するために何をしたのかを正確に知っているだけでいいです。 :) –
@DylanBeattie匿名型を 'object'にキャストします。それをしないでください。 LINQのように型を汎用的に保つか、正しい型でローカルに保つようにしてください。他のすべては禁止です。 – Luaan