2013-05-03 2 views
5

Я конвертирую некоторые данные из WinGrid в выражение, чтобы отфильтровать некоторый вывод для пользователя. У меня есть первоначальная коллекция (MyObjectType), я применяю некоторые динамические фильтры, и я получаю отфильтрованную коллекцию.Linq Выражения: двоичный оператор Equal не определен для типов «MyEnum» и «System.Enum»

У меня проблемы с перечислением - свойство 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.GetEqualityComparisonOperator (ExpressionType binaryType, String opName, Expression слева, выражение права, Boolean liftToNull) в System.Linq.Expressions.Expression.Equal (Expression влево, вправо Expression)

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.Equals и MyEnum.Equals. Вместо использования Expression.Equal используйте метод Expression.Call для вызова метода константы Equals.

В качестве альтернативы, если это всегда делается с перечислениями, вы можете безопасно преобразовать их все в целые числа (или какой бы ни был самый большой тип поддержки). Тогда вам не нужно преобразовывать жесткий код в конкретное перечисление - он будет работать с любым перечислением на основе целых чисел. Если он используется для вещей, кроме перечислений, то лучше использовать Expression.Call.