如var anonymous = new { name="", num=0 };
通过反射怎么创建上面的匿名类
通过反射怎么创建上面的匿名类
解决方案 »
- BHO失效了,找不到原因,求救!
- 请教一个简单的问题,大家帮帮忙,谢谢,关于线程与UI相关的
- 将时间的分钟数尾数转化成0或者5
- 请高手帮忙解决多线程与队列的问题【c#】
- 请大家帮个忙,同时读写文件问题
- 新手问题:enum类型是静态的吗,enum为什么不能定义成string类型
- 这段代码如何写得更漂亮一些(图形平移)
- C#中!如何用SOCKET提取客户端POST过来的文件字节?
- 橡皮筋好了,麻子脸来了
- 现在有一个自定义文件格式,里面包含了一些图片信息和其他信息,怎么把里面的图片信息提取出来作为文件的图标?
- 如何去掉一个字符串的后4位?
- 关于System.IO.File.Exists判断的是个共享文件,返回false,怎么办
{
/// <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);
}
}
{
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);
的表达式
的表达式