之前曾介紹過 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 的物件即可,非常方便。
文章標籤
全站熱搜
