Linq表达式:没有为类型'MyEnum'和'System.Enum'定义二元运算符Equal

时间:2013-05-03 09:30:33

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

我将一些数据从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

然后发生以下异常:

  

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

     

在   System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType   binaryType,String opName,表达式左,表达式右,布尔值   liftToNull)在System.Linq.Expressions.Expression.Equal(Expression   左,表达右)

enter image description here

PS。

我发现如果我做了

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

这个工作,但我想不要像这样规范每种类型的枚举,因为它是一个通用函数!?

1 个答案:

答案 0 :(得分:1)

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

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