有一个类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 类中搜索那些确切的字段名称,并基于该名称获取属性并填充表达式列表。
首先弄清楚如何为一个属性名称执行此操作。
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();