C# 如何为x=>;创建简单表达式树;x、 名单

C# 如何为x=>;创建简单表达式树;x、 名单,c#,lambda,expression,C#,Lambda,Expression,你能帮我为下面的代码建立一个表达式树吗 class House { public string Address { get; set; } public List<Room> Rooms { get; set; } } class Room { public string Name { get; set; } } 阶级之家 { 公共字符串地址{get;set;} 公共列表室{get;set;} } 教室 { 公共字符串名称{get;set;} } 我

你能帮我为下面的代码建立一个表达式树吗

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


class Room
{
    public string Name { get; set; }
}
阶级之家
{
公共字符串地址{get;set;}
公共列表室{get;set;}
}
教室
{
公共字符串名称{get;set;}
}

我需要将
house=>house.Rooms
传递给参数类型为
Expression
的方法。需要知道如何为此创建表达式树。在我的实际项目中,我将通过思考找出
房子
房间
的类型。

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

  • 创建参数以将输入传递到表达式中-您可以通过调用方法并将希望表达式参数接收的类型传递给它来实现
  • 生成表达式体-使用
    表达式
    类的其他方法来构建描述表达式的表达式树
  • 将参数与主体相结合-调用的重载之一,将所需的委托类型传递给它
在您的情况下,这些步骤如下所示:

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);
var参数=表达式参数(房屋类型),“h”);
var body=Expression.Convert(
Expression.Property(参数“房间”)
,类型(IEnumerable)
);
var res=表达式.Lambda(主体,参数);

主体向属性getter添加强制转换表达式。如果属性是通过反射发现的,并且您有一个
PropertyInfo
,则可以使用不同的重载。

解释得很好,谢谢!如果我的要求是为x=>x创建树,其中x将是列表。我将创建typeof(IEnumerable)的参数。但是我如何为它创建body呢?@user3219798对于表达式
x=>x
如果类型匹配,body将是参数本身;如果类型不匹配,则
var body=expression.Convert(parameter)、typeof(IEnumerable))