如何为 x=>x.List 创建一个简单的表达式树
How to create a simple Expression tree for x=>x.List
你能帮我为下面的代码构建一个表达式树吗?
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
的类型。
构建表达式由三部分组成:
- 制作用于将输入传递给表达式的参数 - 您可以通过调用
Expression.Parameter
方法,并将您希望表达式参数接收的类型传递给它.
- 制作表达式主体 - 使用
Expression
class的其他方法来构建描述您的表达式的表达式树。
- 将参数与主体组合 - 调用
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
,你可以使用不同的重载。
你能帮我为下面的代码构建一个表达式树吗?
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
的类型。
构建表达式由三部分组成:
- 制作用于将输入传递给表达式的参数 - 您可以通过调用
Expression.Parameter
方法,并将您希望表达式参数接收的类型传递给它. - 制作表达式主体 - 使用
Expression
class的其他方法来构建描述您的表达式的表达式树。 - 将参数与主体组合 - 调用
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
,你可以使用不同的重载。