2008-10-21 13 views
55

Gibt es eine Möglichkeit, eine überladene Methode mithilfe von Reflektion in .NET (2.0) aufzurufen. Ich habe eine Anwendung, die dynamisch Klassen instanziiert, die von einer gemeinsamen Basisklasse abgeleitet wurden. Aus Kompatibilitätsgründen enthält diese Basisklasse 2 gleichnamige Methoden, eine mit Parametern und eine ohne. Ich muss die Methode ohne Parameter über die Invoke-Methode aufrufen. Gerade jetzt, alles, was ich bekomme, ist ein Fehler, der mir sagt, dass ich versuche, eine mehrdeutige Methode zu nennen.Verwenden von Reflection zum Aufrufen einer überladenen Methode in .NET

Ja, ich könnte nur das Objekt als Instanz meiner Basisklasse und rufen Sie die Methode, die ich brauche. Schließlich wird wird passieren, aber jetzt, interne Komplikationen wird es nicht zulassen.

Jede Hilfe wäre großartig! Vielen Dank.

Antwort

89

Sie müssen festlegen, welche Methode Sie wollen:

class SomeType 
{ 
    void Foo(int size, string bar) { } 
    void Foo() { } 
} 

SomeType obj = new SomeType(); 
// call with int and string arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[] { typeof(int), typeof(string) }) 
    .Invoke(obj, new object[] { 42, "Hello" }); 
// call without arguments 
obj.GetType() 
    .GetMethod("Foo", new Type[0]) 
    .Invoke(obj, new object[0]); 
+0

funktioniert wie ein Charme verwendet werden !!! Ich wünschte, ich habe diesen Post eine Stunde zurück :) –

+5

Sie können auch Type.EmptyTypes –

+2

müssen nach "typeof (int), typeof (string)" zu kompilieren :) –

14

Ja. Wenn Sie die Methode aufrufen, übergeben Sie die Parameter, die der gewünschten Überladung entsprechen.

Zum Beispiel:

Type tp = myInstance.GetType(); 

//call parameter-free overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new object[0]); 

//call parameter-ed overload 
tp.InvokeMember("methodName", BindingFlags.InvokeMethod, 
    Type.DefaultBinder, myInstance, new { param1, param2 }); 

Wenn Sie tun dies umgekehrt (dh durch die Member zu finden und ruft Invoke) darauf achten, dass Sie die richtige ist - die parameterfreie Überlastung der erste sein könnte, gefunden.

+0

Interessanterweise dies funktionierte nicht. Ich habe keine Parameter an meine parameterlose Methode übergeben, und ich bekam immer noch einen mehrdeutigen Anruf. –

+0

Wie funktioniert das mit Parametern verschiedener Typen? Angenommen, ich habe zwei Überladungen, wobei eine eine Zeichenfolge und die andere eine Ganzzahl annimmt. – smaclell

+0

Kein Problem - die zugrunde liegenden Typen der Parameter sind, was überprüft wird. – Keith

5

Verwenden Sie die GetMethod-Überladung, die einen System.Type [] übernimmt, und übergeben Sie einen leeren Typ [];

typeof (Class).GetMethod ("Method", new Type [ 0 ] { }).Invoke (instance, null); 
+3

Sie können Type.EmptyTypes –

Verwandte Themen