2010-10-12 61 views
0

的invoke方法的參數我有包含了像功能層級的變量:傳遞函數爲的System.Reflection

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

的問題是線

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執行的lambda表達式(匿名方法)的委託。

+0

實際上,我從表中獲取值(函數層次結構),因此它將以字符串形式顯示,而不是函數。請建議 – 2010-10-12 11:55:28

+0

因此,代碼實際上指出'string str =「fun1(...)」;',對吧?但這是**非常不同的情況。沒有辦法使用反射來執行這種表達。您很可能必須使用CodeDom將其編譯爲臨時程序集並執行它。 – 2010-10-12 11:58:43

+0

感謝您的支持 – 2010-10-12 12:02:42