生成POCO属性的属性选择器表达式

时间:2019-01-18 09:35:30

标签: c# reflection

我有一堂课

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

现在我要生成一个列表:

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

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

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

/* etc... */

最简单的方法是什么?

EDIT :要澄清:我想为类中的每个属性生成此列表,例如像这样的东西:

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

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

1 个答案:

答案 0 :(得分:3)

您可以通过反射和动态表达式创建来实现:

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);
}