2012-04-02 18 views
9

Ich kann Type.InvokeMember verwenden, um eine Methode über Reflektion aufzurufen, und es scheint ziemlich robust, zum Beispiel Param-Array-Parameter. Aus irgendeinem Grund behandelt es jedoch keine optionalen Parameter.Rufen Sie eine Methode mit optionalen Parametern über Reflexion

Gibt es einen besser integrierten Ansatz zum Aufrufen einer Methode (vielleicht mit dem DLR), die optionale Parameter berücksichtigt?

+0

Sie können type.GetMethod (...) aufrufen, um eine MethodInfo-Instanz abzurufen. Dann können Sie methodInfo.Invoke() aufrufen, für optionale Parameter können Sie Type.Missing übergeben –

+0

Aber das erfordert, dass ich zu dem Aufwand der Iteration über alle möglichen Instanzen der Methode gehen und erarbeiten, ob meine Parameter angesichts der optionalen geeignet sind Parameter. Ich mache das Binden im Grunde manuell, was ich gerade mache. Scheint einfach, dass Type.InvokeMember 90% des Weges geht und dann scheitert. Betrachtet man das Duplikat, erscheint es, dass ich es vorerst manuell mache. –

Antwort

5

Im folgenden Beispiel rufen wir eine Funktion mit zwei Parametern auf, die nichts zurückgeben. Der zweite Parameter ist optional.

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

Danke für die Antwort. Das Problem dabei ist, dass ich noch in die Metadaten eindringen muss, um festzustellen, dass der optionale Parameter existiert, damit ich Type.Missing übergeben kann. Ich habe auf eine Lösung gehofft, die im Grunde die Bindungsfähigkeiten des C# -Compilers zur Laufzeit repliziert hat. –

+0

@JamesGaunt Alte Post, aber hast du irgendwann einen Weg gefunden? –

+0

Wow ja sehr alt ... Ich habe irgendwie einen Weg gefunden ... aber nur mit dem Roslyn-Compiler, um das C# direkt gegen die erforderlichen Abhängigkeiten zur Laufzeit zu kompilieren. Also nicht das gleiche Problem lösen. Aber es gibt wahrscheinlich Möglichkeiten, die neuen Compiler-Funktionen zu verwenden, um einige Beispielcode zu kompilieren und dann den AST zu untersuchen, um zu sehen, was es auch binden würde. –

Verwandte Themen