我有一些代码将强类型的业务对象映射为匿名类型,然后将其序列化为JSON并通过API公开。为什么Object.Equals()在从不同的程序集实例化时为相同的匿名类型返回false?
将我的解决方案重组为单独的项目后,我的一些测试开始失败。我做了一些挖掘,事实证明,Object.Equals
在匿名类型上的行为不同,这些匿名类型由不同程序集的代码返回 - 我不知道为什么,或者我能做些什么来解决它。
有https://github.com/dylanbeattie/AnonymousTypeEquality完整的repro代码,但实际上打破的位低于。这个代码是在测试项目:
[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“的相同匿名类型的两个实例只有在它们的所有属性相同时才是相等的。“ (我的重点) - 那么控制两个实例是否为相同匿名类型用于比较目的是什么?我的两个实例具有相同的哈希代码,并且两者似乎都是<>f__AnonymousType0`2[System.String,System.Int32]
- 但我猜测匿名类型的平等必须考虑完全限定的类型名称,因此将代码移入不同的程序集可能会破坏事情。任何人都得到了确切的来源/链接究竟如何实现?
我有一段时间没有任何问题被咬伤......这真的很高兴知道你做什么来挑起咬伤。 :) –
@DylanBeattie您将一个匿名类型转换为'object'。永远不要这样做。要么保持泛型类型(如LINQ那样),要么确保使用正确的类型保持本地类型。其他一切都是禁止的。 – Luaan