问题描述
|
我正在尝试使用给定的类型和属性名称来构建属性选择器表达式。即t => t.PropertyName。
下面的代码可以很好地编译,但结果为空。有人可以指出代码中的错误吗?
public static Expression<Func<T,object>> CreatePropSelectorExpression(string propName) where T:class,new()
{
var temp = Activator.CreateInstance<T>();
ParameterExpression t = Expression.Parameter(typeof(T),\"t\");
MemberExpression member = Expression.PropertyOrField(Expression.Constant(temp),propName);
return Expression.Lambda<Func<T,object>>(member,t);
}
提前致谢
解决方法
您实际上不需要创建对象
T
的实例,而只是创建一些表达式树。归根结底是这样的:
Expression<Func<T,object>> CreatePropSelectorExpression<T>(string propertyName)
{
var parameter = Expression.Parameter(typeof(T));
var body = Expression.Convert(Expression.PropertyOrField(parameter,propertyName),typeof(object));
return Expression.Lambda<Func<T,object>>(body,parameter);
}
, 嵌套版本
static Expression<Func<R,O>>
CreatePropSelectorExpression<R,O>(IEnumerable<string> propertyName)
{
ParameterExpression parameter = Expression.Parameter(typeof(R));
Expression selector = propertyName
.Aggregate((Expression)parameter,(a,name) => Expression.PropertyOrField(a,name));
return Expression.Lambda<Func<R,O>>(selector,parameter);
}