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

            }

  • 相关阅读:
    5.6Java 创建File
    5.6Java File ApI
    Java字符集乱码
    5.17Java文件的拷贝
    5.10Java实操IO流,面向接口编程,面向父类编程
    5.6Java File对象使用递归打印子孙级目录以及文件的名称
    5.10JavaIo流四大抽象类
    5.17Java文件字节流
    5.7通过Maven配置seleeniumjava依赖
    5.6Java多态的介绍
  • 原文地址:https://www.cnblogs.com/rock_chen/p/1826395.html
Copyright © 2011-2022 走看看