【发布时间】: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?!不与表达式一起使用,而是在对象之间使用 -
抱歉,实际上并不清楚您要达到的目标
-
同意。目前尚不清楚您要做什么。另外,
Value、objectParam和objectPropertyName来自哪里?另外,顺便说一句,VB 不是 C# - 不区分大小写,所以Dim constantExpression As ConstantExpression是禁忌。它可以工作,但你在上下文的其余部分隐藏了ConstantExpression。 -
If TypeOf Value Is [Enum]条件的目的是什么?我认为这就是导致您的问题的原因。
标签: .net vb.net linq linq-expressions