加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – Linq表达式:没有为类型’MyEnum’和’System.Enum’定

发布时间:2020-12-17 07:27:37 所属栏目:百科 来源:网络整理
导读:我将一些数据从WinGrid转换为表达式,以便将一些输出过滤到用户. 我有一个初始集合(MyObjectType),我应用了一些动态过滤器,我获得了一个过滤集合. 我有一个枚举的问题 – MyObjectType的属性. 枚举是标准枚举 Public Enum MyEnum A B CEnd Enum 这是我获取表
我将一些数据从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)

PS.

我观察到如果我这样做

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读