如var anonymous = new { name="", num=0 };
通过反射怎么创建上面的匿名类

解决方案 »

  1.   

    我想动态字符参数来构造一个匿名类来生成一个Expression树,为了减少错误想略去构造匿名类的过程,因为参数足够可以构造一个类出来。以前我看了篇文章是通过反射生成匿名类的。当时觉得这个方法很傻,因为像1楼所说没必要搞得这么复杂,现在觉得有这个必要去这样做,所以想请教各位指点一下小弟。
      

  2.   

    我把代码贴出来,有人能帮我优化一下吗?最好能去掉匿名类的掉用,这样能真正通过字符参数动态构造Expressionpublic static class LinqSelect
        {
            /// <summary>
            /// 动态投影
            /// </summary>
            /// <typeparam name="T">实体类</typeparam>
            /// <param name="expression">源表达式(如Expression.Constant(DataContext.EntitySet<T>))</param>
            /// <param name="keys">关键字(数据字段field为键,显示名text为值</param>
            /// <param name="anonymousType">匿名类(如var anonymous = new { Name="", Age=0 }; </param>
            /// <returns></returns>
            public static Expression Select<T>(Expression expression, Dictionary<string,string> keys, Type anonymousType)
            {
                ParameterExpression paramTable = Expression.Parameter(typeof(T), "table");
                List<Expression> list = new List<Expression>();
                Expression[] paramFields = new Expression[keys.Count];
                Expression[] paramPropertys = new Expression[keys.Count];
                ParameterExpression[] paramTexts = new ParameterExpression[keys.Count];
                System.Reflection.MemberInfo[] memberInfos = new System.Reflection.MemberInfo[keys.Count];
                int i = 0;
                foreach (string key in keys.Keys)
                {
                    paramFields[i] = null;
                    paramTexts[i] = Expression.Parameter(anonymousType.GetProperty(keys[key]).PropertyType, keys[key]);
                    System.Reflection.PropertyInfo propertyInfo = null;
                    string[] strTemp = key.Split(new char[] { '.' });
                    foreach (string str in strTemp)
                    {
                        if (str == strTemp[0])
                        {
                            propertyInfo = typeof(T).GetProperty(str);
                            paramFields[i] = Expression.Property(paramTable, propertyInfo);
                        }
                        else
                        {
                            propertyInfo = propertyInfo.PropertyType.GetProperty(str);
                            paramFields[i] = Expression.Property(paramFields[i], propertyInfo);
                        }
                    }
                    list.Add(paramFields[i]);
                    paramPropertys[i] = Expression.Equal(paramTexts[i], paramFields[i]);
                    memberInfos[i] = anonymousType.GetMember(keys[key])[0];
                    i++;
                }
                Expression paramConstrator = Expression.New(anonymousType.GetConstructors()[0], list, memberInfos);
                Expression lambdaExpression = Expression.Lambda(paramConstrator, paramTable);
                return Expression.Call(typeof(Queryable), "Select", new Type[] { typeof(T), anonymousType },
                    expression, lambdaExpression);
            }
        }
      

  3.   

    假如现在有个EntitySet<Person>的结构为Person
    {
        string Name{get;set}
        int Age{get;set}
        string Sex{get;set}
        string Email{get;set}
    }然后想投影Name和Age,则可以这样调用Dictionary<string, string> dictionary = new Dictionary<string, string>();
    dictionary.add("Name", "姓名");
    dictionary.add("Age", "年龄");
    Expression = LinqSelect.Select<Person>(Expression.Constant(dataContext.Person), 
    dictionary, new { Name="", Age=0 }.GetType());这样就生成dataContext.Person.Select(person => 姓名=person.Name, 年龄=person.Age);
    的表达式
      

  4.   

    这样就生成dataContext.Person.Select(person => new { 姓名=person.Name, 年龄=person.Age }); 
    的表达式