2016-07-08 9 views
-1

Ich habe eine sehr spezifische Situation. Ich muss einen Funktionsnamen vom Benutzer akzeptieren und diesen Funktionsnamen (wir wissen bereits, dass diese Funktion existiert) an eine andere Methode weitergeben, die Funktionsaufrufe behandelt. Diese Methode heißt RunMethod und akzeptiert Func<string, string> method.Übergabe der Funktionsname zu Func Delegat

Ich weiß, dass ich so etwas wie verwenden:

string methodName = "methodName"; 
MethodInfo mi = this.GetType().GetMethod(methodName); 
mi.Invoke(this, null); 

Aber in diesem Fall würde ich die RunMethod Methode ändern muß, und es ist keine Option aufgrund bestehenden Code verwendet es.

Also, wie gebe ich eine Zeichenfolge als Methodenname an eine andere Methode, die Func<string, string> akzeptiert?

Eine vereinfachte Implementierung:

static void Main(string[] args) 
{ 
    var pr = new Program(); 

    Console.WriteLine("Enter a method name: "); 

    // user enters a method name 
    string input = Console.ReadLine(); 

    // Can accept Method1 or Method2 as parameter 
    // But we need to pass the "input" 
    RunMethod(Method1); 

    Console.WriteLine("Press any key to exit"); 
    Console.ReadKey(); 
} 

static void RunMethod(Func<string, string> method) 
{ 
    Console.WriteLine(method("John Doe")); 
} 

static string Method1(string name) 
{ 
    return "method 1 called : " + name; 
} 

static string Method2(string name) 
{ 
    return "method 2 called : " + name; 
} 

Antwort

5

So wie gebe ich eine Zeichenfolge als Methodennamen an eine andere Methode, die Func<string, string> akzeptiert?

Sie nicht - Sie erstellen eine statt. Sie können mit Delegate.CreateDelegate das tun:

var method = GetType().GetMethod(...); 
var func = (Func<string, string>) Delegate.CreateDelegate(
    typeof(Func<string, string>), method); 
RunMethod(func); 

Beachten Sie, dass dies voraus, dass Sie bereits herausgefunden haben, wie man das Verfahren in geeigneter Weise zu erhalten - in Ihrem Beispielcode, Ihre Methoden sind privat, so dass Sie BindingFlags.Static | BindingFlags.NonPublic in die passieren bräuchten GetMethod Anruf.

Komplettes Beispiel:

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Enter a method name: "); 

     // user enters a method name 
     string input = Console.ReadLine(); 

     var method = typeof(Program).GetMethod(input, 
      BindingFlags.Static | BindingFlags.NonPublic); 
     var func = (Func<string, string>) Delegate.CreateDelegate(
      typeof(Func<string, string>), method); 
     RunMethod(func); 
    } 

    static void RunMethod(Func<string, string> method) 
    { 
     Console.WriteLine(method("John Doe")); 
    } 

    static string Method1(string name) 
    { 
     return "method 1 called : " + name; 
    } 

    static string Method2(string name) 
    { 
     return "method 2 called : " + name; 
    } 
} 
+0

@ user3185569: Warum sollte es einen 'ArgumentException' werfen? –

+0

'method' ist null! – VSG24

+0

In meinem Fall wäre es 'pr.GetType(). GetMethod (input);' und es ist null. – VSG24