12

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

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

a => a.SomePropertyName

a泛型类型在哪里,它将具有名称的属性SomePropertyName

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

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

这可能很简单,但我不太熟悉表达式树,如果有类似的问题,请链接并关闭它

4

2 回答 2

9

假设事先不知道参数类型和返回类型,您可能必须使用 some 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);
于 2013-01-24T11:51:31.043 回答
4

你可以使用这个:

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

Expression.Lambda(body, p);
于 2013-01-24T11:51:39.097 回答