根据字符串列表用类属性填充表达式列表

问题描述 投票:0回答:1

有一个类Employee,定义如下:

class Employee
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string Address { get; set; }
}

我需要填写表达式列表,如下所示:

var expressions = new List<Expression<Func<Employee, object>>>()
{
   e => e.Id,
   e => e.Name
}

但这应该基于另一个字符串

   var fields = new List<string>() { "Id", "Name" };

所以想法是用字段字符串列表中的那些字段填充表达式列表。因此,我们将在 Employee 类中搜索那些确切的字段名称,并基于该名称获取属性并填充表达式列表。

c# .net lambda c#-4.0 expression
1个回答
1
投票

首先弄清楚如何为一个属性名称执行此操作。

Expression<Func<Employee, object>> GetExpression(string propertyName) {
    var parameter = Expression.Parameter(typeof(Employee));
    var propertyInfo = typeof(Employee).GetProperty(propertyName);
    if (propertyInfo == null) {
        throw new Exception("No such property!");
    }
    var memberAccess = Expression.Property(parameter, propertyInfo);
    return Expression.Lambda<Func<Employee, object>>(
        propertyInfo.PropertyType.IsValueType ?
            Expression.Convert(memberAccess, typeof(object)) :
            memberAccess, 
        parameter);
}

请注意,如果属性的类型是值类型,则需要一个

Expression.Convert
。这是把值装箱成一个
object
.

然后你就可以

Select
名单:

List<Expression<Func<Employee, object>>> GetExpressions(List<string> propertyNames) =>
    propertyNames.Select(n => GetExpression(n)).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.