创建表达式树以访问Generic类型的属性

时间:2013-01-24 11:45:06

标签: c# linq generics expression-trees

我需要编写一个泛型方法,该方法以字符串格式获取泛型类型和属性名称的实例并返回表达式树

我需要转换一个简单的lambda表达式

a => a.SomePropertyName

其中a是通用类型,将具有属性,名称为SomePropertyName

我知道我们可以使用以下反射代码获取属性信息

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

这可能很简单,但我不熟悉表情树,如果有类似问题,请链接并关闭此

2 个答案:

答案 0 :(得分:9)

假设事先不知道参数类型和返回类型,您可能必须使用一些object,但从根本上说这只是:

var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
    Expression.Convert(
        Expression.PropertyOrField(
             Expression.Convert(p, a.GetType()), propName), typeof(object)), p);

如果输入和输出类型已知,您可以调整Func<,>参数,也可以删除Expression.Convert。在极端情况下,你可以通过以下方式获得lambda 而不知道lambda 签名

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);

答案 1 :(得分:4)

您可以使用:

var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");

Expression.Lambda(body, p);