Vergleichsoperator mit Reflection
-
04-10-2019 - |
Frage
Ich möchte zwei Werte zur Laufzeit vergleichen Reflexion verwendet wird. Ich war mit Comparer.Default.Compare (x, y) für diesen, aber ich habe erkannt, dass dies nicht ausreichend ist. Lassen Sie uns sagen, dass ich ein Doppel zu einem einzigen (1,0 == 10) vergleichen möchten. Comparer.Default wird eine Ausnahme werfen, weil sie darauf besteht, dass beiden Werte vom gleichen Typ sein müssen (double). Jedoch eine explizite Konvertierung existiert für diese, was wirklich ist, was ich verwenden möchte.
Also, warum nicht kann ich nur Convert.ChangeType benutzen? Nehmen wir den Fall von 1,25> 1 (double> integer). Wenn ich versuche, Convert.ChangeType (1,25, typeof (int)) auf 1,25, ich will 1 erhalten, und die Behauptung über fehlschlagen, wenn es wirklich 1.25> 1.
So kann jemand vorschlagen, bitte einen Weg, um den expliziten Vergleich von Aufrufen (falls vorhanden), dass ein Typ aus?
Danke.
Lösung
Sind Sie mit C # 4 und .NET 4? Wenn ja, es ist wirklich einfach mit dynamischer Typisierung:
dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever
Der Compiler führt alle entsprechenden Conversions für Sie.
Andere Tipps
Wenn C # 4 ist eine Option, Jon Skeet Vorschlag von dynamischen mit ist höchstwahrscheinlich ideal.
Wenn es nicht ist, dann ...
Es gibt keine expliziten Vergleich. Der Compiler, bei der Kompilierung, funktioniert die Konvertierung, ruft dann den entsprechenden Vergleich.
Ihre beste Wette ist Convert.ChangeType zu konvertieren, um die breitere Art zu verwenden, und führen Sie dann den Vergleich auf dem Ergebnis. Wenn Sie nicht Überprüfung aller Art behandeln möchten, können Sie in der Regel beide Seiten konvertieren decimal
Werte, dann einen einzigen Vergleich, um sie zu überprüfen, da decimal
sollten angemessen alle Ihre Werte verarbeiten.