你能帮我建一个下面代码的表达式树。
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
的方法。需要知道如何为此创建表达式树。在我的实际项目中,我将通过反思找出House
和Room
的类型。
答案 0 :(得分:3)
构建表达式由三部分组成:
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);
正文将一个强制转换表达式添加到属性getter。如果通过反射发现了属性,则可以使用不同的重载,并且您有PropertyInfo
。