如何为 x=>x.List 创建一个简单的表达式树

本文关键字:一个 简单 表达式 创建 List | 更新日期: 2023-09-27 18:36:41

你能帮我为以下代码构建一个表达式树吗?

 class House
{
    public string Address { get; set; }
    public List<Room> Rooms { get; set; }
}

class Room
{
    public string Name { get; set; }
}

我需要将house=>house.Rooms传递给具有类型为 Expression<Func<TModel, IEnumerable<TValue>>> expression 的参数的方法。需要知道如何为此创建表达式树。在我的实际项目中,我将通过反思找出HouseRoom的类型。

如何为 x=>x.List 创建一个简单的表达式树

构建表达式由三部分组成:

  • 创建参数以将输入传递给表达式 - 通过调用Expression.Parameter方法并向其传递您希望表达式参数接收的类型来实现。
  • 创建表达式主体 - 使用类的其他方法Expression构造描述表达式的表达式树。
  • 将参数与主体组合 - 调用Expression.Lambda的一个重载,向其传递所需的委托类型。

在您的情况下,这些步骤如下所示:

var parameter = Expression.Parameter(typeof(House), "h");
var body = Expression.Convert(
    Expression.Property(parameter, "Rooms")
,   typeof(IEnumerable<Room>)
);
var res = Expression.Lambda<Func<House,IEnumerable<Room>>>(body, parameter);

正文将强制转换表达式添加到属性获取器。如果属性是通过反射发现的,并且您有PropertyInfo,则可以使用不同的重载。