动态属性选择器lambda函数

问题描述

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...