.net - Linq 表达式 : The binary operator Equal is not defined for the types 'MyEnum' and 'System.Enum'

标签 .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

然后发生以下异常:

The binary operator Equal is not defined for the types 'MyEnum' and 'System.Enum'.

at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull) at System.Linq.Expressions.Expression.Equal(Expression left, Expression right)



enter image description here

附注。

我观察到如果我这样做
expr = Expression.Equal(objectPropertyParam, 
       Expression.Convert(constantExpression, GetType(MyEnum)))

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

最佳答案

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

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

关于.net - Linq 表达式 : The binary operator Equal is not defined for the types 'MyEnum' and 'System.Enum' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16355706/

相关文章:

c# - 将 Unicode 代理项对转换为文字字符串

.net - Exchange Management Powershell-如何在这里获取Name属性的值?

vb.net - 如何使用 VB.NET 获取计算机的名称和 IP 地址?

.net - 如何从进程名称中获取应用程序名称?

c# - 解压缩来自 WebClient 的 gzip 响应

c# - 有没有什么办法可以聚焦(选项卡控件)图片框?

java - 在Java中引用dll

c# - 返回 IQueryable 的 Linq 查询中的内部方法

c# - 聚合多维数组

c# - 如何从列表 linq C# 的列表中获取列表 <string>