c# – 动态Lambda表达式构建器在枚举上崩溃

为了能够在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>

点赞