作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你能帮我为下面的代码构建一个表达式树吗?
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
通过反射(reflection)。
最佳答案
构建表达式由三部分组成:
Expression.Parameter
来完成方法,并将您希望表达式参数接收的类型传递给它。Expression
类的其他方法构建描述表达式的表达式树。Expression.Lambda
的重载之一,将所需的委托(delegate)类型传递给它。在您的情况下,这些步骤将如下所示:
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
,则可以使用不同的重载。
关于c# - 如何为 x=>x.List 创建一个简单的表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841738/
我是一名优秀的程序员,十分优秀!