创建用于访问泛型类型属性的表达式树

本文关键字:表达式 属性 泛型类型 用于 访问 创建 | 更新日期: 2023-09-27 17:56:02

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

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

a => a.SomePropertyName

其中a是泛型类型,它将具有一个名为 SomePropertyName

的属性

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

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

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

创建用于访问泛型类型属性的表达式树

假设参数类型和返回类型事先不知道,您可能需要使用一些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);

你可以使用这个:

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