14 Stimmen

Ist es möglich, Werttypoperatoren über Reflexion aufzurufen?

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.

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.

11voto

FdW Punkte 131

Wie wäre es damit, es ist einfach, klein und funktioniert :)

public T Add<T>(object x, object y)
{
    return (T)Convert.ChangeType((dynamic)x + (dynamic)y, typeof(T));
}

7voto

Barry Kelly Punkte 40566

Ja, die benutzerdefinierten Operatoren können mit Hilfe von Reflection aufgerufen werden (sie haben spezielle Namen, wie op_Addition), aber System.Int32 definiert sie nicht, da die grundlegenden, eingebauten Typen direkt durch IL-Opcodes wie add als Methodenaufrufe.

4voto

Marc Gravell Punkte 970173

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

0voto

Martin Liversage Punkte 100306

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 .

0voto

Kenan E. K. Punkte 13604

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X