webentwicklung-frage-antwort-db.com.de

Aufruf einer Funktion aus einem String in C #

Ich weiß, in php können Sie einen Anruf tätigen wie:

$function_name = 'hello';
$function_name();

function hello() { echo 'hello'; }

Ist das in .Net möglich?

123
Jeremy Boyd

Ja. Sie können Reflexion verwenden. Etwas wie das:

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

Sie können Methoden einer Klasseninstanz mit Reflektion aufrufen, indem Sie einen dynamischen Methodenaufruf ausführen:

Angenommen, Sie haben eine Methode namens "Hallo" in der aktuellen 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);
64
CMS
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();
        }
    }
36
BFree

Eine geringfügige Tangente - wenn Sie eine gesamte Ausdruckszeichenfolge analysieren und auswerten möchten, die (verschachtelte!) Funktionen enthält, betrachten Sie NCalc ( http://ncalc.codeplex.com/ und nuget).

Ex. leicht geändert aus der Projektdokumentation:

// 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());

Innerhalb des EvaluateFunction-Delegaten würden Sie Ihre vorhandene Funktion aufrufen.

0
drzaus

In der Tat arbeite ich an Windows Workflow 4.5 und habe einen Weg gefunden, einen Delegierten von einer Statemachine an eine 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 Delegierten innerhalb der Methode zu konvertieren. Sehr schöne Antwort. Vielen Dank. Überprüfen Sie diesen Link https://msdn.Microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx

0
Antonio Leite