Handle Null-Parameter beim Aufruf einer Methode mit Reflection

8

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.

%Vor%

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.

%Vor%

Hauptsächlich versuche ich herauszufinden, wie ich meinen Code ändern kann, so dass auch die Zeile /*2*/ funktioniert.

    
palswim 11.05.2011, 18:28
quelle

8 Antworten

6

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:

Ссылка

    
ScottTx 11.05.2011, 21:01
quelle
5

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.

    
Morten Mertner 19.05.2011 23:49
quelle
3

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%     
BrandonAGr 11.05.2011 20:48
quelle
2

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.

    
Ben Robinson 11.05.2011 18:48
quelle
1

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.

%Vor%

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.

%Vor%     
palswim 12.05.2011 22:31
quelle
0

Ich habe es nicht getestet und ich denke, die anderen Antworten sind viel besser, aber ich frage mich, warum das nicht funktionieren würde:

%Vor%     
Oliver 24.05.2011 12:51
quelle
0

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%     
Pablo Rodda Donate 24.05.2011 13:52
quelle
0
  1. Wenn keiner der Parameter NULL ist, führen Sie den üblichen Methodenaufruf durch, wenn einer jedoch null ist
  2. Ansonsten, wenn mindestens eins null ist, nimmst du einen anderen Ansatz:
  3. build Parametertyp Liste von Parametern: wie "int, char, null, int"
  4. Übernehmen Sie Funktionen mit der gleichen Anzahl von Parametern für Ihren Funktionsnamen
  5. schau, ob es nur eine passende Funktion gibt, denn wenn es 2 gibt, kannst du nicht bestimmen, was du anrufen sollst (schwierigster Teil, aber ziemlich einfach, denke ich)
  6. rufen Sie die Funktion auf, die Sie mit Ihren Parametern und Nullen herausgefunden haben
Valentin Kuzub 24.05.2011 14:10
quelle

Tags und Links