ユーザーへの出力をフィルタリングするために、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、式の左、式の右、Boolean liftToNull) で System.Linq.Expressions.Expression.Equal (式の左、式の右) で
PS。
私がそうするなら、私はそれを観察しました
expr = Expression.Equal(objectPropertyParam,
Expression.Convert(constantExpression, GetType(MyEnum)))
これは動作しますが、ジェネリック関数であるため、このような列挙の各タイプを指定しないでください!?