Передача функции в качестве параметра в методе invoke system.reflection - PullRequest
0 голосов
/ 12 октября 2010

У меня есть переменная, которая содержит иерархию функций, такую ​​как:

string str= "fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()))" 

// эта иерархия приходит как строка из базы данных

Я импортировал System.reflection и использовал метод invokeчтобы вызвать его, но он работает, только если у меня есть только одна функция fun1.

При использовании вышеуказанной иерархии функций полное выражение воспринимается как одно имя функции.

Я использую приведенный ниже код для вызова своей иерархии функций:

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;
}  

Ссылка: http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx

Скажите, пожалуйста, что мне делать?

1 Ответ

1 голос
/ 12 октября 2010

Проблема в том, что строка

string str= fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()));

не представляет выражение или то, что вы называете «иерархией функций».Вместо этого он выполняет правую часть присваивания оценивает в строковое значение.

Что вы, вероятно, ищете, это:

Func<string> f = () => fun1(fun2(),fun3(fun4(fun5(34,33,'aa'),'value',fun6()));
…
string result = f();

Здесь,«F» - это делегат, в который вы назначаете лямбда-выражение (анонимный метод), которое впоследствии может быть выполнено путем вызова делегата f.

...