为了能够在LINQ中动态使用字符串,我使用我构建的以下辅助函数来从字符串构造Lambda表达式:
public static Func<ObjectToOrder, object> GetSortExpression<ObjectToOrder> (string field) {
var param = Expression.Parameter(typeof(ObjectToOrder), "objectToOrder");
var mySortExpression = Expression.Lambda<Func<ObjectToOrder, object>>(Expression.Property(param, field), param);
return mySortExpression.Compile();
}
我将在下面的示例中解释此函数的工作原理:我有一个具有三个属性的Person:
class Person {
public string Name {get;set;}
public int Age {get;set;}
public EnumerateType Type {get;set;}
}
enum EnumerateType {
Normal = 1,
Premium = 2
}
然后在Person of List中,我会使用我的帮助函数按这种方式按任何属性排序:
List<Person> people = new List<Person>();
//Create people in the list
//...
people = people.OrderBy(GetSortExpression<Person>("Name")).ToList();
people = people.OrderBy(GetSortExpression<Person>("Age")).ToList();
people = people.OrderBy(GetSortExpression<Person>("Type")).ToList();
使用Name和Age属性可以正常工作,但是使用Type属性时,在执行“var mySortExpression = Expression.Lambda>(Expression.Property(param,field),param)”时会引发以下异常;“辅助功能:
Cannot use a expression of type 'EnumerateType' for the returned value type 'System.Object'
为什么会这样?我应该怎么做才能解决它并能够为枚举创建一个lambda表达式(我认为内部枚举是整数)?
谢谢
编辑:我注意到它也崩溃任何DateTime属性.
最佳答案 实际上,它也因Age而失败:
Expression of type ‘System.Int32’ cannot be used for return type ‘System.Object’
当前的问题是您需要从值类型到对象的转换(在本例中为一个框):
var mySortExpression = Expression.Lambda<Func<ObjectToOrder, object>>(
Expression.Convert(
Expression.Property(param, field),
typeof(object)
), param);
但是,在这里使用对象本身就可能存在问题.我建议看看Dynamic LINQ OrderBy on IEnumerable<T>