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

  • 相关阅读:
    读INI文件的类
    [导入].net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
    [导入]Sending email with c# using SMTP Servers
    [导入]Writing an ActiveX control with .Net
    C#基础之Dom笔记8
    韩顺平Java笔记内容简纳
    文本文件的检索
    ASP之vbscript笔记1
    数据库原理整理笔记1
    linux课程笔记2(崔老师)
  • 原文地址:https://www.cnblogs.com/swarb/p/9924210.html
Copyright © 2011-2022 走看看