Frage

Gibt es eine Möglichkeit, eine überladene Methode mithilfe von Reflektion in .NET Invoke (2.0). Ich habe eine Anwendung, die dynamisch Klassen instanziiert, die von einer gemeinsamen Basisklasse abgeleitet wurde. Aus Kompatibilitätszwecken enthält diese Basisklasse 2 Methoden mit dem gleichen Namen, ein mit Parametern und eine ohne. Ich brauche die parameterlos Methode über die Invoke-Methode aufzurufen. Gerade jetzt, alles, was ich bekommen, ist ein Fehler mir zu sagen, dass ich versuche, eine mehrdeutige Methode aufzurufen.

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

Jede Hilfe wäre toll! Danke.

War es hilfreich?

Lösung

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

Andere Tipps

Ja. Wenn Sie rufen die Methode die Parameter übergeben, die die Überlastung übereinstimmen, die Sie wollen.

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 diese in die andere Richtung zu tun Runde vorsichtig sein, dass Sie die richtige ist (das heißt durch die Member zu finden und ruft Invoke..) - der Parameter freie Überlast könnte der erste gefunden werden

Mit der GetMethod Überlastung, die ein System.Type [] nimmt, und übergeben Sie einen leerer Typ [];

typeof ( Class ).GetMethod ( "Method", new Type [ 0 ] { } ).Invoke ( instance, null );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top