Выражения Linq: бинарный оператор Equal не определен для типов MyEnum и System.Enum.

Я преобразовываю некоторые данные из 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.

at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType, String opName, Выражение слева, Выражение справа, Boolean liftToNull) at System.Linq.Expressions.Expression.Equal(Выражение слева, Выражение справа)

введите здесь описание изображения

PS.

Я заметил, что если я сделаю

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

Это работает, но я бы не хотел указывать каждый тип подобных перечислений, потому что это общая функция!?


person serhio    schedule 03.05.2013    source источник
comment
Разве вы не можете использовать оператор Is?   -  person Teejay    schedule 03.05.2013
comment
Is?! используется не с выражениями, а между объектами   -  person serhio    schedule 03.05.2013
comment
Извините, на самом деле неясно, чего вы пытаетесь достичь   -  person Teejay    schedule 03.05.2013
comment
Согласованный. Непонятно, что вы пытаетесь сделать. Кроме того, откуда взялись Value, objectParam и objectPropertyName? Кроме того, в стороне, VB не C # - регистр не учитывается, поэтому Dim constantExpression As ConstantExpression - нет-нет. Это работает, но вы скрываете ConstantExpression для остальной части контекста.   -  person J...    schedule 03.05.2013
comment
Какова цель условия If TypeOf Value Is [Enum]? Я думаю, что это то, что вызывает вашу проблему.   -  person svick    schedule 03.05.2013


Ответы (1)


Проблема, с которой вы столкнулись, заключается в разнице между Object.Equals и MyEnum.Equals. Вместо использования Expression.Equal используйте Expression.Call для вызова метода константы Equals.

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

person Samuel Neff    schedule 09.08.2013