首页 > 解决方案 > 为 POCO 属性生成属性选择器表达式

问题描述

我有一堂课:

public class User 
{
    public string Name { get; set; }
    public int Age { get; set; }
}

现在我想生成一个列表:

List<Expression<Func<User, object>>> selectorExpressions = /* ... */

该列表应该包含与此示例 lambda 匹配的每个属性的选择器表达式:

user => user.Name;
user => user.Age;

/* etc... */

实现这一目标的最简单方法是什么?

编辑:澄清:我想为类中的每个属性生成这个列表,例如这样的:

List<Expression<Func<User, object>>> selectorExpressions = Util.GetSelectorsForEveryProperty<User>();

我不想为我需要的每个属性手动编写 lambda。

标签: c#reflection

解决方案


您可以通过反射和动态表达式创建来做到这一点:

var selectorExpressions = new List<Expression<Func<User, object>>>();

foreach (var prop in typeof(User).GetProperties())
{
    var arg = Expression.Parameter(typeof(User), "x");
    var property = Expression.Property(arg, prop.Name);
    var cast = Expression.Convert(property, typeof(object));
    var expr = Expression.Lambda<Func<User, object>>(cast, arg);                
    selectorExpressions.Add(expr);
}   

推荐阅读