web-dev-qa-db-fra.com

Appeler une fonction d'une chaîne en C #

Je sais en php que vous êtes capable de faire un appel comme:

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

function hello() { echo 'hello'; }

Est-ce possible en .Net?

123
Jeremy Boyd

Oui. Vous pouvez utiliser la réflexion. Quelque chose comme ça:

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

Vous pouvez appeler les méthodes d'une instance de classe à l'aide de la réflexion, en effectuant un appel de méthode dynamique:

Supposons que vous ayez une méthode appelée hello dans une instance réelle (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

Une légère tangence - si vous souhaitez analyser et évaluer une chaîne d'expression entière contenant des fonctions (imbriquées!), Considérez NCalc ( http://ncalc.codeplex.com/ et nuget)

Ex. légèrement modifié par rapport à la documentation du projet:

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

Et dans le délégué EvaluateFunction, vous appelez votre fonction existante.

0
drzaus

En fait, je travaille sur Windows Workflow 4.5 et je dois trouver un moyen de passer un délégué d’une machine à statuer à une méthode sans succès. La seule façon pour moi de trouver était de passer une chaîne avec le nom de la méthode que je voulais transmettre en tant que délégué et de convertir la chaîne en délégué à l'intérieur de la méthode. Très belle réponse. Merci. Vérifiez ce lien https://msdn.Microsoft.com/en-us/library/53cz7sc6(v=vs.110).aspx

0
Antonio Leite