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();

            }

  • 相关阅读:
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路(基础篇)
    进阶之路
    C语言连接MySQL数据库(转)
    Linux下mysql的远程连接(转)
    Linux 操作MySQL常用命令行(转)
    Linux(Ubuntu12.04)上玩儿STC单片机(转)
    信号量 Linux函数 semget();semctl();semop();(转)
  • 原文地址:https://www.cnblogs.com/rock_chen/p/1826395.html
Copyright © 2011-2022 走看看