zoukankan      html  css  js  c++  java
  • 利用DynamicExpression.ParseLambda实现Eval

    模拟实现,性能还不错,比DynamicInvoke性能好的多。

    中间加了一次Convert,可以实现任何对象的属性的调用,也就是EvalEx.GetEval<Func<object, object>>方式

        public static class EvalEx

        {

            public static T GetEval<T>(Type type, string propertyPath)

            {

                if (type == null)

                    return default(T);

                var func = DynamicExpression.ParseLambda(type, null, propertyPath);

                var objParameter = System.Linq.Expressions.Expression.Parameter(typeof(object), "obj");

                var objConvert = System.Linq.Expressions.Expression.Convert(objParameter, type);

                var objInvoke = System.Linq.Expressions.Expression.Invoke(func, objConvert);

                var resultExpression = System.Linq.Expressions.Expression.Lambda<T>(objInvoke, objParameter);

                return resultExpression.Compile();

            }

        }

            static void Main(string[] args)

            {

                var list = new List<TT>();

                for (int i = 0; i < 10000; i++)

                {

                    list.Add(new TT() { T1 = i.ToString(), T3 = i });

                }

                Stopwatch sw = new Stopwatch();

                var do1 = EvalEx.GetEval<Func<TT, string>>(typeof(TT), "T1+ (T3*100).ToString() ");

                var do2 = EvalEx.GetEval<Func<object, string>>(typeof(TT), "T1+ (T3*100).ToString() ");

                var do3 = EvalEx.GetEval<Func<object, object>>(typeof(TT), "T1+(T3*100).ToString() ");

                sw.Start();

                list.ForEach(p => do1(p));

                Console.WriteLine(sw.Elapsed);

                sw.Restart();

                list.ForEach(p => do2(p));

                Console.WriteLine(sw.Elapsed);

                sw.Restart();

                list.ForEach(p => do3(p));

                Console.WriteLine(sw.Elapsed);

                sw.Restart();

                list.ForEach(p => do1.DynamicInvoke(p));

                Console.WriteLine(sw.Elapsed);

                sw.Stop();

                Console.Read();

            }

  • 相关阅读:
    scala 中的修饰符
    scala 主从构造器
    scala 伴生对象与伴生类
    scala 通过apply创建类的对象
    kali linux 全版本(以前的版本)镜像下载
    install python in wine
    SSH防爆破脚本
    SSH私用私钥登陆
    linux 内核提权
    Windows下MYSQL读取文件为NULL
  • 原文地址:https://www.cnblogs.com/rock_chen/p/1826395.html
Copyright © 2011-2022 走看看