• 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;
            }

  • 相关阅读:
    VS 2010 C#入门操作小技巧
    spring-data-jpa 多数据源
    Spring--3.Spring的单元测试
    Spring--5.IOC总结
    Spring--4.实验23.IOC容器的测试泛型依赖注入*
    Spring--2.Spring之IOC--IOC容器的22个实验(3)
    Spring--2.Spring之IOC--IOC容器的22个实验(2)
    Spring--2.Spring之IOC--IOC容器的22个实验(1)
    Spring--2.Spring之IOC--了解IOC容器
    Spring--1.了解Spring
  • 原文地址:https://www.cnblogs.com/swarb/p/9924210.html
Copyright © 2020-2023  润新知