【问题标题】:Linq Expressions: The binary operator Equal is not defined for the types 'MyEnum' and 'System.Enum'Linq 表达式:未为类型“MyEnum”和“System.Enum”定义二元运算符 Equal
【发布时间】:2013-05-03 09:30:32
【问题描述】:

我将一些数据从 WinGrid 转换为表达式,以便过滤一些输出给用户。 我有一个初始集合(MyObjectType),我应用了一些动态过滤器,并获得了一个过滤集合。

但是我遇到了枚举问题 - MyObjectType 的属性。

枚举是标准枚举

Public Enum MyEnum
  A
  B 
  C
End Enum

这就是我获得表达式的方式:

Dim constantExpression As ConstantExpression
If TypeOf Value Is [Enum] Then
  constantExpression = Expression.Constant(Value, GetType([Enum]))
Else
  constantExpression = Expression.Constant(Value, Value.GetType())
End If
...
Dim expr As Expression = Nothing
Dim objectPropertyParam = Expression.Property(objectParam, objectPropertyName)

Select Case Me.Operation
  Case ComparisonOperator.Contains, ComparisonOperator.NotContains
  ...
  Case ComparisonOperator.NotEqual
  ...

  Case ComparisonOperator.Equal
    ' THE EXCEPTION IS HERE ---------------------------------------
    expr = Expression.Equal(objectPropertyParam, constantExpression)

  Case ComparisonOperator.GreatherThanOrEqual
    expr = Expression.GreaterThanOrEqual(objectPropertyParam, constantExpression)
  Case ComparisonOperator.LessThanOrEqual
    expr = Expression.LessThanOrEqual(objectPropertyParam, constantExpression)
End Select

然后出现以下异常:

二元运算符 Equal 没有为类型 'MyEnum' 和 'System.Enum'。

在 System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType,字符串 opName,表达式左,表达式右,布尔 LiftToNull) 在 System.Linq.Expressions.Expression.Equal(Expression 左,表达式右)

附言。

我观察到如果我这样做了

expr = Expression.Equal(objectPropertyParam, 
       Expression.Convert(constantExpression, GetType(MyEnum)))

This Works,但我不想像这样指定每种类型的枚举,因为它是一个通用函数!?

【问题讨论】:

  • 不能使用Is 运算符吗?
  • Is?!不与表达式一起使用,而是在对象之间使用
  • 抱歉,实际上并不清楚您要达到的目标
  • 同意。目前尚不清楚您要做什么。另外,ValueobjectParamobjectPropertyName 来自哪里?另外,顺便说一句,VB 不是 C# - 不区分大小写,所以 Dim constantExpression As ConstantExpression 是禁忌。它可以工作,但你在上下文的其余部分隐藏了ConstantExpression
  • If TypeOf Value Is [Enum] 条件的目的是什么?我认为这就是导致您的问题的原因。

标签: .net vb.net linq linq-expressions


【解决方案1】:

您遇到的问题是Object.EqualsMyEnum.Equals 之间的区别。不要使用Expression.Equal,而是使用Expression.Call 来调用常量的Equals 方法。

或者,如果始终使用枚举来完成,那么您可以安全地将它们全部转换为整数(或任何最大的支持类型)。然后,您不必硬编码转换为特定的枚举——它将适用于任何基于整数的枚举。如果它用于枚举以外的东西,那么最好使用Expression.Call

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多