提问人:Mayank Gupta 提问时间:5/18/2023 最后编辑:BhuvaneshwaranMayank Gupta 更新时间:5/18/2023 访问量:30
使用基于字符串列表的类属性填充表达式列表
Fill the List of Expressions with the class properties based on list of string
问:
有一个类 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 类中搜索这些确切的字段名称,并在此基础上获取属性并填写表达式列表。
答:
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.Convert
object
然后你可以只列出名字:Select
List<Expression<Func<Employee, object>>> GetExpressions(List<string> propertyNames) =>
propertyNames.Select(n => GetExpression(n)).ToList();
评论