Als C#-Operatoren z. B. +, +=, == sind überschreibbar. Es lässt mich denken, sie sind eine Art von Methoden, also frage mich, ob es eine Möglichkeit gibt, sie mit Reflexion, auf Int32 zum Beispiel aufrufen.
Antworten
Zu viele Anzeigen?Was genau wollen Sie tun? Der Umgang mit den verschiedenen Bedeutungen von Operatoren (primitiv (auf spezifische AWL-Anweisungen abgebildet), benutzerdefiniert (auf statische Methoden abgebildet) und gehoben (als Muster vom Compiler bereitgestellt)) macht dies mühsam. Wenn Sie nur Folgendes wollen verwenden. die Operatoren, dann ist es möglich, Code zu schreiben, der Operatorunterstützung über Generika . Ich habe einige Code für diese, die frei verfügbar ist in MiscUtil ( Beschreibung und Beispiele ).
Als untypisiertes Beispiel (ein Hinweis, dass dies nicht sehr effizient ist, aber funktioniert):
object x = 123, y = 345; // now forget that we know that these are ints...
object result = Expression.Lambda<Func<object>>(
Expression.Convert(Expression.Add(
Expression.Constant(x), Expression.Constant(y)),
typeof(object))).Compile()();
Es wäre sehr ineffizient, wenn das Addieren oder Vergleichen zweier Ganzzahlen einen Methodenaufruf erfordern würde. Daher werden diese einfachen Operationen für die Grundtypen, wie in einer anderen Antwort erläutert, durch Code generiert und können nicht durch Reflexion aufgerufen werden. Ein interessanter eingebauter Wertetyp ist decimal
(oder System.Decimal
). Diese struct
bietet Unterstützung für Literalwerte in C#, verhält sich aber ähnlich wie ein real Werttyp und stellt eine Vielzahl von Operatoren zur Verfügung, die über Reflexion aufgerufen werden können.
Wenn Sie neugierig sind, können Sie Reflektor um alle Mitglieder zu durchsuchen, die von System.Int32
.
Es gibt hier gute Antworten, daher möchte ich nur etwas hinzufügen, das noch nicht erwähnt wurde:
Eine Struktur könnte eine Operator überlastet . Das bedeutet, dass mehr Optionen zu prüfen sind, wenn Sie versuchen, einen programmatischen Ansatz zu erstellen.
Eine schöne Sache, die man ausprobieren kann, ist der Ansatz des Ausdrucksbaums. Hier ist eine kleine Stichprobe. Natürlich ist die Leistung nicht besonders gut, aber wir wissen ja, worauf wir uns mit Reflection einlassen.
6 Stimmen
Operatoren können nicht sein außer Kraft gesetzt . Sie können sein überlastet . Das ist ein großer Unterschied.
1 Stimmen
Um es deutlicher zu machen: Mit override kann man die Implementierung neu definieren, mit overloading kann man eine weitere Methode mit demselben Namen, aber mit anderen Parametern hinzufügen. Vielen Dank für den Hinweis.
0 Stimmen
Ich habe auf den Kommentar geantwortet und ein Beispiel ohne Typisierung hinzugefügt.