簡體   English   中英

將表達式計算為字符串,返回對象?

[英]Evaluate expression as string, return object?

基本上我有一些代碼,當它發生時,我需要設置一些對象等於某個表達式。 所有這些“做什么”爵士樂都存儲為一個字符串。 所以我解析它,並使用反射來找到我正在做的對象。 現在我需要找出如何將值存儲到此對象。 問題是值可能是“1”,“1 *(5/2)”或“某個字符串值”。 如果我能有像“this.SomeProperty”或“(x> 3?4:5)”這樣的表達式,那真的很酷。

此外,它存儲的對象可以是字符串,int,double或float。

VS2008樣本包括一個漂亮的ExpressionParser ,它可以用作通用表達式解析器( VS2008樣本 )。 通過一些小更新和一個自定義工廠類,我們可以把它變成更具表現力的東西:

string expression = "(1 + 2)";
var func = FunctionFactory.Create<int>(expression);

要么:

expression = "(a * b)";
var func2 = FunctionFactory.Create<int, int, int>(expression, new[] { "a", "b" });

這些Create方法的返回類型是Func<>實例,這意味着我們得到了很好的強類型委托:

int result = func2(45, 100); // result = 450;

我把代碼推到了一個要點

更新 :我最近也在博客上寫過這篇文章

更新2 ,另一個例子:

var person = new Person { Age = 5 };
string expression = "(Age == 5)";
var func3 = FunctionFactory.Create<Person, bool>(expression);

bool isFive = func3(person); // Should be true.

你見過http://ncalc.codeplex.com嗎?

它的可擴展性,快速性(例如,具有自己的緩存)使您能夠通過處理EvaluateFunction / EvaluateParameter事件在運行時提供自定義函數和變量。 它可以解析的示例表達式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)"); 

  e.Parameters["Pi2"] = new Expression("Pi * Pi"); 
  e.Parameters["X"] = 10; 

  e.EvaluateParameter += delegate(string name, ParameterArgs args) 
    { 
      if (name == "Pi") 
      args.Result = 3.14; 
    }; 

  Debug.Assert(117.07 == e.Evaluate()); 

它還可以本地處理unicode和許多數據類型。 如果你想改變語法,它會附帶一個鹿茸文件。 還有一個支持MEF加載新功能的fork。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM