【问题标题】:Dynamic Lambda Expression builder crashes on enumerates动态 Lambda 表达式构建器在枚举时崩溃
【发布时间】: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 属性而崩溃。

【问题讨论】:

标签: c# .net linq lambda


【解决方案1】:

实际上,Age 也失败了:

“System.Int32”类型的表达式不能用于返回类型“System.Object”

直接的问题是您需要从值类型转换(在本例中为框)到object:

var mySortExpression = Expression.Lambda<Func<ObjectToOrder, object>>(
    Expression.Convert(
        Expression.Property(param, field),
        typeof(object)
    ), param);

但是,在这里使用object 本身可能会出现问题。我建议看Dynamic LINQ OrderBy on IEnumerable<T>

【讨论】:

  • 感谢@MarcGravell 的回答,通过转换我可以解决异常问题。我正在尝试您的动态 LINQ 方法,但我的 VS 无法识别函数 ApplyOrder。我在哪里可以找到所需的参考资料?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多