zoukankan      html  css  js  c++  java
  • expression select表达式动态构建

    参考:

    http://blog.csdn.net/tastelife/article/details/7340205

    http://blog.csdn.net/sweety820/article/details/39203087

    源码:

            private static Expression<Func<TSource, TResult>> CreateSelecter<TSource, TResult>(Dictionary<string,string> fieldDic)
            {
                Expression<Func<TSource, TResult>> selector = null;


                //(rec)
                ParameterExpression param = Expression.Parameter(typeof(TSource), "x");
                //new ParadigmSearchListData 
                var v0 = Expression.New(typeof(TResult));
                //Number
                List<MemberBinding> bindingList = new List<MemberBinding>();
                foreach (var item in fieldDic)
                {
                    var p = typeof(TResult).GetProperty(item.Key);
                    Expression right = GetProperty<TSource>(null, item.Value, param);
                    //right= Expression.Constant(right, p.PropertyType);
                    var v = Expression.Convert(GetProperty<TSource>(null, item.Value, param), p.PropertyType);
                    var m = Expression.Bind(p, v);
                    bindingList.Add(m);
                }
                Expression body = Expression.MemberInit(v0, bindingList);


              selector = (Expression<Func<TSource, TResult>>)Expression.Lambda(body, param);


                return selector;
            }


            public static Expression GetProperty<T>(Expression source, string Name, ParameterExpression Param)
            {
                Name = Name.Replace(")", "");
                string[] propertys = null;
                if (Name.Contains("=>"))
                {
                    propertys = Name.Split('.').Skip(1).ToArray();
                }
                else
                {
                    propertys = Name.Split('.');
                }
                if (source == null)
                {
                    source = Expression.Property(Param, typeof(T).GetProperty(propertys.First()));
                }
                else
                {
                    source = Expression.Property(source, propertys.First());
                }
                foreach (var item in propertys.Skip(1))
                {
                    source = GetProperty<T>(source, item, Param);
                }
                return source;
            }

  • 相关阅读:
    okhttp进行网络传输文件
    bazel、tensorflow_serving、opencv编译问题
    Linux下设置和查看环境变量(转)
    std::move的实际工作过程
    虚拷贝
    移动构造函数和移动赋值
    while(cin>>word)时的结束方法
    转:windows下命令行工具
    eclipse大括号高亮显示---颜色很淡,改为显眼的颜色
    转: Eclipse 分屏显示同一个文件
  • 原文地址:https://www.cnblogs.com/swarb/p/9924210.html
Copyright © 2011-2022 走看看