2013-05-03 8 views
5

ユーザーに出力をフィルタリングするために、WinGridのデータの一部を式に変換します。 (MyObjectTypeの)初期コレクションがあり、いくつかの動的フィルタを適用し、フィルタリングされたコレクションを取得します。Linq式: 'MyEnum'と 'System.Enum'の型に2進演算子Equalが定義されていません

ただし、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 

次の例外が発生します

バイナリ演算子均等ではありません'MyEnum'タイプと 'System.Enum'タイプで定義されています。 System.Linq.Expressions.Expression.Equal(左式 、式右の System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType、文字列OPNAME、左式、右の数式、ブール liftToNull)で

enter image description here

PS。

は私が観察され、私がしなければ

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

これは作品が、私は一般的な機能であるため、このような列挙型の各タイプをspecityいないたいと思います!

+0

'Is'演算子を使用できませんか? – Teejay

+0

'Is' ?!式ではなく、オブジェクトの間で使用されます – serhio

+0

申し訳ありませんが、実際にあなたが達成しようとしていることは明確ではありません – Teejay

答えて

1

あなたが遭遇している問題は、Object.EqualsMyEnum.Equalsの違いです。 Expression.Equalの代わりにExpression.Callを使用すると、定数のEqualsメソッドを呼び出すことができます。

また、これが常にenumで行われている場合は、それらをすべて整数に安全に(または最大のバッキングタイプが何であれ)変換できます。次に、特定の列挙型にハードコード変換する必要はありません。整数ベースの列挙型でも機能します。列挙型以外のものに使用されている場合は、Expression.Callを使用するのが最適です。

関連する問題