【发布时间】:2013-12-20 16:11:56
【问题描述】:
为了能够在 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
}
然后在人员列表中,我将使用我的辅助函数以这种方式按任何属性排序:
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 属性而崩溃。
【问题讨论】: