2013-06-12 17 views
5

olmadan iki nesneyi, kutulu türlerini derleme zamanında tanımak mümkün müdür? karşılaştırılabilir mi? Örneğin, bir object{long} ve object{int} varsa, kutulu değerlerin eşit olup olmadığını bilmenin bir yolu var mı?C kutlanan nesneleri karşılaştırın C#

Benim yöntem iki genel object s alır ve iç türlerinin derleme zamanında ne olduğunu bilmenin bir yolu yoktur. Şu anda, karşılaştırma aşağıdaki kodu tarafından yapılır:

_keyProperties[x].GetValue(entity, null).Equals(keyValues[x]) 

, diyelim ki, _keyProperties[x].GetValue(entity, null) bir object{long} ve keyValues[x] bir object{int} olduğunu (ancak onlar da ters çevrilebilir).

Bunun için birim testlerim için sahte bir depo yapıyorum ve here açıklandığı gibi genel bir depo uygulaması ekleyerek başladım. Bu uygulama, Find yönteminde iki genel sahte DB anahtarını karşılaştırır.

+1

gördün mü [Bu cevap] (http: // stackoverflow .com/a/6669045/728795), özellikle ikinci kısmı? – Andrei

+0

Tabii ki yaptım, ancak "bir null nesnesini bir değer türüne dönüştüremiyor" iletisiyle "System.InvalidCastException" alıyorum. – frapontillo

+1

@frapontillo Sadece null çek eklemeniz gerekiyor mu? –

cevap

2

Bu durum için çok yavaş olabilir, ama Aşağıdaki kodun gösterdiği gibi, testi yapmak için dynamic kullanabilirsiniz: Kod desteğine oluşturulan rağmen

object obj1 = 1; 
object obj2 = 1.0; 

if (obj1.Equals(obj2)) 
    Console.WriteLine("Yes"); 
else 
    Console.WriteLine("No"); // Prints "No" as you'd expect. 

if ((dynamic) obj1 == (dynamic) obj2) 
    Console.WriteLine("Yes"); // Prints "Yes" because it handles trivial conversions. 
else 
    Console.WriteLine("No"); 

(dynamic kullanarak yavaş olabilir unutmayın En azından bu bölüm bir kereden fazla gerçekleştirilmez, önbelleğe alınır. Ayrıca

tip alakalı değilse bazı sorunları olabilir - bu bir istisna durumu Örneğin see here for more discussion.

:

object obj1 = "Hello"; 
object obj2 = 1.0; 

if ((dynamic) obj1 == (dynamic) obj2) // Throws an exception! 
    Console.WriteLine("Yes"); 
else 
    Console.WriteLine("No"); 
+0

Bu bir çözüm olabilir, ancak bir ifade ağacında karşılaştırmayı yapıyorum ve "Bir ifade ağacı dinamik bir işlem içermiyor olabilir" aldığım derleme hatasıdır. – frapontillo

+1

@frapontillo Ah bu utanç verici, üzgünüm! –

+0

Yine de, bu komik: karşılaştırma kodunu bir yönteme dışa aktararak, derleyici bunun hakkında bir şey yapmıyor ve karşılaştırma çalışıyor! Çok teşekkür ederim! Hızla ilgili bir şey umurumda değil, çünkü bu kadar önemsemediğim testlerde karşılaştırma yapılacak. – frapontillo