使用基于字符串列表的类属性填充表达式列表

Fill the List of Expressions with the class properties based on list of string

提问人:Mayank Gupta 提问时间:5/18/2023 最后编辑:BhuvaneshwaranMayank Gupta 更新时间:5/18/2023 访问量:30

问:

有一个类 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 Lambda C#-4.0 表达式

评论


答:

2赞 Sweeper 5/18/2023 #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.Convertobject

然后你可以只列出名字:Select

List<Expression<Func<Employee, object>>> GetExpressions(List<string> propertyNames) =>
    propertyNames.Select(n => GetExpression(n)).ToList();