Güçlü bir şekilde yazılan iş nesnelerini anonim türlere eşleyen, daha sonra JSON'a serileştirilen ve bir API aracılığıyla gösterilen bazı kodlar var. Çözümümün ayrı projelere yeniden yapılandırılmasından sonra bazı testlerim başarısız olmaya başladı. Biraz kazma yaptım ve bu Object.Equals
farklı bir derleme tarafından kod tarafından döndürülen anonim türlerde farklı davranıyor - ve neden emin değilim, ya da etrafında çalışmak için ne yapabilirim.Object.Equals(), farklı derlemeler tarafından oluşturulduğunda neden aynı anonim türler için yanlış döndürüyor?
https://github.com/dylanbeattie/AnonymousTypeEquality numaralı telefondan tam bir repro kodu var ama aslında kırılan biraz değer aşağıda. Bu kod Testler projede geçerli:
[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 };
}
}
ardından içeren çözeltide ayrı sınıf kütüphanesi var ancak bu:
namespace OtherClasses {
public static class OtherClass {
public static object MakeObject(string name, int value) {
return new { name, value };
}
}
}
göre MSDN için, "aynı anonim türden iki örneği yalnızca tüm özellikleri eşit olduğunda eşittir. " (Benim vurgu) - Yani karşılaştırma amacıyla iki örnek aynı anonim tip olup olmadığını kontrol eder? İki örneğimin eşi karma kodları var ve her ikisi de <>f__AnonymousType0`2[System.String,System.Int32]
olarak görünüyor - ancak anonim türlerin eşitliğinin tam olarak nitelenen tür adını hesaba katması gerektiğini ve bu nedenle kodun farklı bir gruba taşınmasını sağladığını tahmin ediyorum. Bunun nasıl uygulandığı konusunda kesin bir kaynak/bağlantı var mı?
Bir süre içinde ısırılmakta zorlanıyorum ... ısırığı provoke etmek için ne yaptığınızı tam olarak bilmek güzel. :) –
@DylanBeattie 'object' için anonim bir yazı yazdınız. Bunu asla yapma. Jenerik türü (LINQ gibi) ya da yerel olarak doğru türde kaldığınızdan emin olun. Diğer her şey prohibidado. – Luaan