Passe fonction en tant que paramètre dans la méthode d'invocation de System.Reflection
-
29-09-2019 - |
Question
J'ai une variable qui contient la hiérarchie des fonctions comme:
string str= "fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()))"
// cette hiérarchie est à venir comme une chaîne de base de données
J'ai importé et utilisé System.Reflection Invoke méthode pour l'invoquer, mais il ne travaille si j'ai une seule fonction fun1
.
Avec hiérarchie de fonction au-dessus prend l'expression complète comme nom d'une fonction.
J'utilise ce code pour appeler ci-dessous ma hiérarchie de fonction:
public static string InvokeStringMethod(string typeName, string methodName)
{
// Get the Type for the class
Type calledType = Type.GetType(typeName);
// Invoke the method itself. The string returned by the method winds up in s
String s = (String)calledType.InvokeMember(
methodName,
BindingFlags.InvokeMethod | BindingFlags.Public |
BindingFlags.Static,
null,
null,
null);
// Return the string that was returned by the called method.
return s;
}
Référence: http://www.codeproject.com/KB/cs/CallMethodNameInString. aspx
S'il vous plaît me dire ce que dois-je faire?
La solution
Le problème est la ligne
string str= fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()));
ne pas représentent une expression, ou ce que vous appelez une 'hiérarchie de fonction'. , Il exécute plutôt le côté droit de l'affectation evalue en une valeur de chaîne.
Ce que vous cherchez probablement est la suivante:
Func<string> f = () => fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()));
…
string result = f();
Ici,'f' est un délégué dans lequel vous attribuez une expression lambda (méthode anonyme) qui peut ensuite être exécutée en invoquant le f
délégué.