c# 动态表达式

本文演示了如何使用ExpressionEvaluator库来计算简单和复杂的表达式。首先,展示了如何计算一个包含数学运算的简单表达式。接着,解释了如何处理包含变量字段的复杂表达式,通过注册类型和编译表达式来实现动态计算。示例中,计算基于Result类的Days和Bonus属性的表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备:

创建一个空项目,nuget查找并安装ExpressionEvaluator

示例:

using ExpressionEvaluator;
using System;

 一、计算简单表达式

       public string Test1()
        {
            return SimpleEval("0.1*(Math.Pow(10,2)+20)");
        }


        /// <summary>
        /// 简单数值计算
        /// </summary>
        /// <param name="str">纯表达式</param>
        /// <returns>返回值</returns>
        public  string SimpleEval(string str)
        {
            var types = new TypeRegistry();
            types.RegisterDefaultTypes();

            var expression = new CompiledExpression(str) { TypeRegistry = types };
            var result = expression.Eval();
            Console.WriteLine("简单数值计算: {0}", result);
            return result.ToString();
        }

二、计算复杂表达式

    public class Result
    {
        public double Days { get; set; }
        public double Bonus { get; set; }
    }

        /// <summary>
        /// 变量字段的计算
        /// </summary>
        /// <param name="str"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public   string FieldEval(string str, Object type)
        {
            //注册
            var reg = new TypeRegistry();
            reg.RegisterSymbol("Result", type);
            //如果要使用Math函数,还就注册这个
            //reg.RegisterDefaultTypes();

            //编译
            var p = new CompiledExpression(str) { TypeRegistry = reg };
            p.Compile();

            //计算
            Console.WriteLine("变量字段计算: {0}", p.Eval());
            return p.Eval().ToString();
        }

        public string Test2()
        {
            string[] strFields = new string[] { "Days", "Bonus" };
            string exp = "(Days*10)+(Bonus/2)";
            for (int i = 0; i < strFields.Length; i++)
            {
                if (exp.Contains(strFields[i]))
                {
                    exp = exp.Replace(strFields[i], "Result." + strFields[i]);
                }


            }
            Result re = new Result()
            {
                Days = 200,
                Bonus = 500
            };

            var result = this.FieldEval(exp, re);
            return result;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值