Ich versuche Code zu schreiben, der Typen aus einer Parameterliste ableitet und dann die Methode aufruft, die diesen Parametern entspricht. Dies funktioniert sehr gut, außer wenn die Parameterliste einen null
Wert enthält.
Ich frage mich, wie ich den Aufruf von Type.GetMethod
veranlassen kann, eine Funktion / Überladung zu finden, sogar mit einem Parameter null
in der Parameterliste.
Die Hauptproblemzeile ist types.Add((param == null) ? null : param.GetType());
, was dazu führt, dass der GetMethod
-Aufruf mit einem null
-Wert im Array types fehlschlägt.
Hauptsächlich versuche ich herauszufinden, wie ich meinen Code ändern kann, so dass auch die Zeile /*2*/
funktioniert.
Es gibt Überschreibungen für den GetMethod-Aufruf, die ein von der Binder-Klasse abgeleitetes Objekt enthalten. Auf diese Weise können Sie die Standardmethodenbindung außer Kraft setzen und die Methode, die Sie verwenden möchten, basierend auf den tatsächlich übergebenen Parametern zurückgeben. Dies ist im Wesentlichen das, was auch die anderen beiden Antworten tun. Hier ist ein Beispielcode:
Eine Option, die nicht erwähnt wurde, ist Fasterflect , eine Bibliothek, die Reflektionsaufgaben einfacher und schneller macht (durch IL-Generierung). .
Um eine Methode aufzurufen, die ein Wörterbuch benannter Parameter (oder ein Objekt mit Eigenschaften, die als Parameter verwendet werden sollen) gegeben hat, können Sie die beste Übereinstimmung wie folgt aufrufen:
%Vor%Wenn Sie nur die Parameterwerte und ihre Reihenfolge haben, können Sie eine andere Überladung verwenden:
%Vor%PS: Sie müssen die neuesten Bits von der Quellcodeverwaltung abrufen, um die TryCallMethodWithValues-Erweiterung zu nutzen.
Haftungsausschluss: Ich bin ein Beitrag zum Fasterflect-Projekt.
Für jeden Parameter, der null ist, können Sie einfach mit einem beliebigen Referenztyp übereinstimmen. Der folgende sehr einfache / naive Code funktioniert wie gezeigt für Ihre Methoden, aber er behandelt keine Dinge wie Ausnahmen bei Zweideutigkeiten oder komplexere Fälle mit ref / out-Parametern oder die Möglichkeit, einen abgeleiteten Typ an die Methode oder generische Methoden zu übergeben.
Wenn Sie 4.0 verwenden, ist die Verwendung von dynamic möglicherweise die bessere Wahl.
%Vor%Ich denke, Sie müssten tun:
%Vor%Machen Sie im Wesentlichen Ihre eigene Überladungsauflösung. Sie könnten Ihre vorhandene Methode zuerst versuchen, die Ausnahme abfangen und dann das obige ausprobieren.
Dank dem MSDN-Link sowie einigen zusätzliche SO Diskussion und eine externe Forum-Diskussion mit einem prominenten SO-Mitglied habe ich habe versucht, eine eigene Lösung zu implementieren, die für mich bisher funktioniert.
Ich habe eine Klasse erstellt, die die Binder
-Klasse geerbt hat, und meine Logik in die% cos_de% Argumente / Typen eingegeben.
Da die Klasse null
eine abstrakte Klasse ist, müssen Sie einige andere Elemente überschreiben, um diesen Code tatsächlich zu verwenden, aber die meisten meiner Überschreibungen werden nur vor dem Objekt Binder
ausgeführt.
Sie könnten das Problem angehen, indem Sie Ihr eigenes GetMethod implementieren, das die gesamte Methode im Objekt durchläuft und bestimmt, welche die beste Übereinstimmung ist. Ich hoffe, das hilft. Ich habe die folgende Methode mit dem von Ihnen bereitgestellten Beispiel getestet und es funktionierte
%Vor%Tags und Links c# reflection null