之前曾介紹過 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 的物件即可,非常方便。

arrow
arrow
    全站熱搜

    卑微研究生 發表在 痞客邦 留言(0) 人氣()