2009-07-03 2 views
2

Gibt es eine Möglichkeit, den C# -Compiler zu zwingen, fehlende Operatorüberladungen für Objekte zu ignorieren und diese Prüfung stattdessen in der Laufzeit zu verarbeiten? Ich frage, weil ich einen Container habe, der mehrere Objekte hat, die verschiedene Attribute vom Typ int, string, ushort usw. haben. Ich mache eine Suchfunktion für diesen Container und würde gerne in verschiedenen Feldern suchen können.Wie man Objekte "annehmen" lässt, haben sie eine Überlastung für den Operator X bekommen?

Ich verwende Prädikate und Lambda-Ausdrücke.

Dies ist, was ich will:

var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate)); 

ID und Datum der Annahme Felder sind in den Objekten des Containers

Das ist, was ich heute zu tun haben (es funktioniert, obwohl):

var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate)); 

Das zusätzliche Casting ist nicht sehr gut im Vergleich zum ersten Beispiel, ich möchte es nicht tun müssen. Ich hätte gerne die Möglichkeit, dies stattdessen in Runtime zu überprüfen.

Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

3

Nein, C# 3.0 bietet keine Unterstützung für Operatoren, ohne den Typ zu kennen.

In C# 4.0 können Sie es mit dynamic tun, aber es ist langsamer.

In Ihrem Fall, Sie wissen,, was die Typen sein sollten - so einfach zu werfen (wie Sie sind).


Im allgemeineren Fall:

mit unbekannten Arten, Blick auf Comparer.Default.Compare und object.Equals ...

Mit Generika; schau dir Comparer<T>.Default.Compare(x,y) an - das sollte alles tun, was du brauchst für >, >=, < und <= (einschließlich Nullen usw.). Ebenso behandelt EqualityComparer<T>.Default.Equals(x,y)== und != (einschließlich Nullen usw.).

Weitere Operatoren (+, -, * etc) - siehe MiscUtil

+0

Okay, dann werde ich mit meiner Abgüsse leben. Prost für die schnelle Antwort. :) – Hallgeir

+0

@Hallgeir: Wenn Sie Ihre eigenen Objekte verwenden oder wenn Sie von ihnen ableiten können, können Sie die implizite Umsetzungsoperatorüberladung verwenden. Nicht sicher, ob dies auf Ihre Situation angewendet werden kann. – Abel

Verwandte Themen