web-dev-qa-db-ger.com

Methoden mit Namen in C # aufrufen

Ich habe eine Reihe von "Jobs" in meiner Anwendung, in denen jeder Job eine Liste der aufzurufenden Methoden sowie deren Parameter enthält. Im Wesentlichen wird eine Liste mit dem folgenden Objekt aufgerufen:

string Name;
List<object> Parameters;

Wenn also ein Job ausgeführt wird, möchte ich diese Liste durchgehen und die entsprechenden Methoden aufrufen. Zum Beispiel, wenn ich eine Methode wie die folgende habe:

TestMethod(string param1, int param2)

Mein Methodenobjekt würde so aussehen:

Name = TestMethod
Parameters = "astring", 3

Ist das möglich? Ich kann mir vorstellen, dass hier das Nachdenken der Schlüssel sein wird.

17
Chris

Klar, du kannst es so machen:

public class Test
{
    public void Hello(string s) { Console.WriteLine("hello " + s); }
}

...

{
     Test t = new Test();
     typeof(Test).GetMethod("Hello").Invoke(t, new[] { "world" }); 

     // alternative if you don't know the type of the object:
     t.GetType().GetMethod("Hello").Invoke(t, new[] { "world" }); 
}

Der zweite Parameter von Invoke () ist ein Array von Object, das alle Parameter enthält, die an Ihre Methode übergeben werden sollen.

Angenommen, die Methoden gehören alle zur selben Klasse, dann könnten Sie eine Methode dieser Klasse haben, die ungefähr so ​​aussieht:

public void InvokeMethod(string methodName, List<object> args)
{
    GetType().GetMethod(methodName).Invoke(this, args.ToArray());
}
40
Igby Largeman

NuGet zur Rettung! PM> Install-Package dnpextensions

Sobald Sie dieses Paket in Ihrem Projekt haben, sollten alle Objekte jetzt eine .InvokeMethod() -Erweiterung haben, die den Methodennamen als Zeichenfolge und eine beliebige Anzahl von Parametern verwendet.

Dabei werden technisch gesehen "magische Zeichenfolgen" für die Methodennamen verwendet. Wenn Sie also Ihr Methodenwörterbuch stark eintippen möchten, können Sie die Schlüssel vom Typ MethodInfo erstellen und sie folgendermaßen abrufen ...

MethodInfo[] methodInfos = typeof(MyClass).GetMethods();

Und dann können Sie so etwas tun ...

var methods = new Dictionary<MethodInfo, Object[]>();
foreach (var item in methods)
   item.key.Invoke(null, item.value);  
   // 'null' may need to be an instance of the object that
   // you are calling methods on if these are not static methods.

Oder Sie können eine Variation des obigen Blocks mit den bereits erwähnten dnpextensions durchführen.

1
jrizzo

Wenn Sie .NET Framework 4 verwenden, lesen Sie dynamic , andernfalls GetMethod , und rufen Sie dann Invoke von MethodInfo auf.

1

Verwenden Sie MethodBase.Invoke () . Sollte mit System.Reflection auf .NET 2.0 funktionieren.

0
Kongress