2011-03-23 51 views
2

我可以定義一個lambda表達式FUNC爲:C# - 我可以根據用戶提供的字符串公式定義一個函數嗎?

Func <int, int, int> Fxy = ((a,b) => a + b)); // Fxy does addition 

但如果我想允許用戶提供r.h.s. lambda表達式在運行時?

String formula_rhs = Console.Readline(); 
// user enters "a - b" 

我可以以某種方式修改FXY我彷彿編碼

Func <int, int, int> Fxy = ((a,b) => a - b)); // Fxy does what the user wants 
                // (subtraction) 

我目前用家建表達式解析器來接受用戶定義的公式。剛剛啓動w .NET,我感覺可能會有一種不太痛苦的方式來做到這一點。

+1

你見過Dynamic LINQ嗎? http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – Gabe 2011-03-23 13:33:48

+0

請參閱:http:// stackoverflow。 COM /問題/ 2965597 /淨-4-運行代碼從串式-CF-的IronRuby,IronPython的 – RBZ 2011-03-23 14:47:46

回答

0

不是那麼容易。 This library包含一些動態Linq功能,您可以使用它將lambda表達式從文本轉換爲Func <>,請看看它。

0

System.Reflection.Emit命名空間適用於即時生成代碼。一般情況下相當複雜,但可能有助於減法等簡單功能。

0

如果您計劃使用不復雜的公式,JScript引擎將簡單的解決方案:

 Microsoft.JScript.Vsa.VsaEngine engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
     MessageBox.Show(Microsoft.JScript.Eval.JScriptEvaluate("((2+3)*5)/2", engine).ToString()); 

不要忘記加上參考Microsoft.JScript裝配

0

使用Linq.Expressions可以在這裏是一個想法。

你的榜樣將tranlate到:

var a = Expression.Parameter(typeof(int), "a"); 
var b = Expression.Parameter(typeof(int), "b"); 
var sum = Expression.Subtract(a, b); 
var lamb = Expression.Lambda<Func<int, int, int>>(sum, a, b); 
Func<int, int, int> Fxy = lamb.Compile(); 

Ofcourse,你將不得不解析字符串到正確表達的樂趣。 :-)

相關問題