2013-06-12 10 views
5

Kann man zwei Objekte ohne vergleichen, wenn man ihre Boxed-Typen zur Kompilierzeit kennt? Zum Beispiel, wenn ich eine object{long} und object{int} habe, gibt es eine Möglichkeit zu wissen, ob die Boxwerte gleich sind?Gekoppelte Objekte in C vergleichen #

Meine Methode ruft zwei generische object s ab, und es gibt keine Möglichkeit zu wissen, was ihre inneren Typen zum Zeitpunkt der Kompilierung sind. Im Moment wird der Vergleich durch den folgenden Code aus:

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

wo, sagen wir, _keyProperties[x].GetValue(entity, null) ist ein object{long} und keyValues[x] ist ein object{int} (aber sie auch umgekehrt werden kann).

Ich brauche dies, weil ich ein Mock-Repository für meine Komponententests erstellen, und ich habe begonnen, indem Sie eine allgemeine Repository-Implementierung wie beschrieben here. Diese Implementierung vergleicht zwei generische gefälschte DB-Schlüssel in seiner Find-Methode.

+1

Kennen Sie schon [diese Antwort] (http: // Stackoverflow .com/a/6669045/728795), besonders sein zweiter Teil? – Andrei

+0

Natürlich tat ich, aber ich bekomme eine 'System.InvalidCastException' mit der Nachricht" Kann ein Null-Objekt nicht in einen Werttyp konvertieren ". – frapontillo

+1

@frapontillo Müssen Sie nur noch einen Null-Check hinzufügen? –

Antwort

2

Auch dies könnte für Ihren Fall langsam sein, aber Sie dynamic verwenden können, den Test zu tun, wie der folgende Code zeigt:

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"); 

Beachten Sie, dass dynamic mit langsam sein kann (obwohl der Code-Unterstützung erzeugt es wird so gecached, dass zumindest dieser Teil nicht mehr als einmal ausgeführt wird).

Auch kann es einige Probleme haben, wenn die Typen nicht verwandt sind - see here for more discussion.

Zum Beispiel diese eine Ausnahme werfen:

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

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

Das könnte eine Lösung sein, aber ich mache den Vergleich innerhalb eines Ausdrucksbaums, und "Ein Ausdrucksbaum darf keine dynamische Operation enthalten" ist der Kompilierungsfehler, den ich bekomme. – frapontillo

+1

@frapontillo Ah, das ist eine Schande, tut mir leid! –

+0

Noch ist das lustig: durch den Export des Vergleichs-Code innerhalb einer Methode, jammert der Compiler nicht darüber und der Vergleich funktioniert! Vielen Dank! Die Geschwindigkeit ist mir wirklich egal, da der Vergleich in Tests gemacht wird, in denen ich mich nicht so sehr darum kümmere. – frapontillo