动态属性选择器lambda函数

时间:2011-06-12 06:37:04

标签: c# properties expression

我正在尝试使用给定的类型和属性名称构建属性选择器表达式。即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);
    }

提前致谢

2 个答案:

答案 0 :(得分:8)

您实际上不需要创建对象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);
}

答案 1 :(得分:1)

嵌套版

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