之前曾介紹過 NCalc,但它有個缺點,就是只支援內建型別,沒有支援自訂的類別,所以我又找了另一個函式庫:C# Expression Evaluator
這個函式庫使用上跟 NCalc 的差別不大,下列是程式碼:
string expression = "a+b"; CompiledExpression e = new CompiledExpression(expression); e.RegisterType("a", 1); e.RegisterType("b", 2); e.Parse(); Func<object> func = e.Compile(); object result = e.Eval(); Console.WriteLine(result);
執行的結果是3,而字串的相加也有支援:
string expression = "a+b"; CompiledExpression e = new CompiledExpression(expression); e.RegisterType("a", "a"); e.RegisterType("b", "b"); e.Parse(); Func<object> func = e.Compile(); object result = e.Eval(); Console.WriteLine(result);
當然,自訂的類別也能使用:
public class MyTestClass { public string StringField { get; set; } public int IntField { get; set; } public double DoubleField { get; set; } public static MyTestClass operator +(MyTestClass m1, MyTestClass m2) { MyTestClass result = new MyTestClass(); result.StringField = m1.StringField + m2.StringField; result.IntField = m1.IntField + m2.IntField; result.DoubleField = m1.DoubleField + m2.DoubleField; return result; } public override string ToString() { string format = "StringField: {0}, IntField: {1}, DoubleField: {2}"; string result = string.Format(format, this.StringField, this.IntField, this.DoubleField); return result; } } static void Main(string[] args) { string expression = "a+b"; CompiledExpression e = new CompiledExpression(expression); e.RegisterType("a", new MyTestClass { StringField = "a", DoubleField = 0.1, IntField = 1 }); e.RegisterType("b", new MyTestClass { StringField = "b", DoubleField = 0.2, IntField = 2 }); e.Parse(); Func<object> func = e.Compile(); MyTestClass result = e.Eval() as MyTestClass; Console.WriteLine(result); }
另外,運算式其實也可以改成:”a.IntField+b.IntField”,之後再指定 a 以及 b 的物件即可,非常方便。
全站熱搜