5

ユーザーへの出力をフィルタリングするために、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)))

これは動作しますが、ジェネリック関数であるため、このような列挙の各タイプを指定しないでください!?

4

1 に答える 1