2009-02-12 9 views

Antwort

197

Ja. Sie können Reflexion verwenden. Beispiel:

Type thisType = this.GetType(); 
MethodInfo theMethod = thisType.GetMethod(TheCommandString); 
theMethod.Invoke(this, userParameters); 
+36

Und das erfordert "using System.Reflection;" – jptsetung

+0

Könnte dies auch verwendet werden, um eine Funktion mit Parameter aufzurufen: zB String f = "Methode (Parameter1, Parameter2)"; – Thunder

+0

Danke @ottobar für die Antwort. Ich weiß nicht, ob das ist, was ich auch suche: Ich brauchte eine SQL-Skalarfunktion in meinem C# -Code. Wie nenne ich es? – Chagbert

-5

In C# können Sie Delegaten als Funktionszeiger erstellen. Überprüfen Sie die folgenden MSDN-Artikel für Informationen zur Verwendung aus: http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx

public static void hello() 
    { 
     Console.Write("hello world"); 
    } 

    /* code snipped */ 

    public delegate void functionPointer(); 

    functionPointer foo = hello; 
    foo(); // Writes hello world to the console. 
+10

dies ist nicht von strings! – nawfal

31
class Program 
    { 
     static void Main(string[] args) 
     { 
      Type type = typeof(MyReflectionClass); 
      MethodInfo method = type.GetMethod("MyMethod"); 
      MyReflectionClass c = new MyReflectionClass(); 
      string result = (string)method.Invoke(c, null); 
      Console.WriteLine(result); 

     } 
    } 

    public class MyReflectionClass 
    { 
     public string MyMethod() 
     { 
      return DateTime.Now.ToString(); 
     } 
    } 
+0

dies ist keine Klasse abhängig –

54

Sie Methoden einer Klasse Instanz aufrufen kann mithilfe von Reflektion, einen dynamischen Methodenaufruf zu tun:

Angenommen, Sie haben eine Methode Hallo in einer der tatsächlichen Instanz (this):

string methodName = "hello"; 

//Get the method information using the method info class 
MethodInfo mi = this.GetType().GetMethod(methodName); 

//Invoke the method 
// (null- no parameter for the method call 
// or you can pass the array of parameters...) 
mi.Invoke(this, null); 
+0

die einfache Antwort. – Fattie

+0

Was ist mit Methoden aus einer "String" -Klasse? mit Framework 4 –

+0

Hallo Leandro Könnten Sie Ihren Kommentar klären? Dies könnte mir und anderen, die an dieser Frage interessiert sind, weiterhelfen –

0

Eine leichte Tangente - wenn Sie eine gesamte expressio analysieren und bewerten möchten n String, der (verschachtelte!) Funktionen enthält, betrachten NCalc (http://ncalc.codeplex.com/ und nuget)

Ex. leicht von der Projektdokumentation geändert:

// the expression to evaluate, e.g. from user input (like a calculator program, hint hint college students) 
var exprStr = "10 + MyFunction(3, 6)"; 
Expression e = new Expression(exprString); 

// tell it how to handle your custom function 
e.EvaluateFunction += delegate(string name, FunctionArgs args) { 
     if (name == "MyFunction") 
      args.Result = (int)args.Parameters[0].Evaluate() + (int)args.Parameters[1].Evaluate(); 
    }; 

// confirm it worked 
Debug.Assert(19 == e.Evaluate()); 

Und im EvaluateFunction delegieren würden Sie Ihre vorhandene Funktion aufrufen.

0

Tatsächlich arbeite ich an Windows Workflow 4.5 und ich muss einen Weg finden, einen Delegaten von einer StateMachine zu einer Methode ohne Erfolg zu übergeben. Die einzige Möglichkeit, die ich finden konnte, bestand darin, eine Zeichenfolge mit dem Namen der Methode zu übergeben, die ich als Delegat übergeben wollte, und die Zeichenfolge in einen Delegaten innerhalb der Methode zu konvertieren. Sehr nette Antwort. Vielen Dank. Überprüfen Sie diesen Link https://msdn.microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx