2013-05-03 13 views
5

I convertire alcuni dati da un WinGrid a un'espressione, per filtrare alcuni output all'utente. Ho una raccolta iniziale (di MyObjectType), applico alcuni filtri dinamici e ottengo una raccolta filtrata.Linq Espressioni: L'operatore binario Equal non è definito per i tipi 'MyEnum' e 'System.Enum'

Ho tuttavia problemi con una proprietà di enumerazione di MyObjectType.

l'enumerazione è un censimento norma

Public Enum MyEnum 
    A 
    B 
    C 
End Enum 

questo è come ottengo l'espressione:

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 

quindi la seguente eccezione si verifica:

L'operatore binario Equal non è definito per i tipi "MyEnum" e "System.Enum".

a System.Linq.Expressions.Expression.GetEqualityComparisonOperator (ExpressionType binaryType, String opname, Espressione sinistra, espressione giusta, booleano liftToNull) a System.Linq.Expressions.Expression.Equal (Espressione a sinistra, giusta espressione)

enter image description here

PS.

ho osservato che se faccio

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

Questo funziona, ma mi piacerebbe piacerebbe non specity ogni tipo di enumerazioni come questo, perché è una funzione generica !?

+0

Non puoi usare l'operatore 'Is'? – Teejay

+0

'Is' ?! non è usato con le espressioni, ma tra gli oggetti – serhio

+0

Spiacente, in realtà non è chiaro cosa stai cercando di raggiungere – Teejay

risposta

1

Il problema che stai incontrando è la differenza tra Object.Equals e MyEnum.Equals. Invece di utilizzare Expression.Equal utilizzare Expression.Call per chiamare il metodo Equals della costante.

In alternativa, se questo viene sempre fatto con le enumerazioni quindi è possibile convertirli tutti a numeri interi in modo sicuro (o qualunque sia il più grande tipo di supporto è). Quindi non devi convertire hard-code in un enum specifico - funzionerà con qualsiasi enum basato su interi. Se è usato per cose oltre l'enumerazione, usare Expression.Call è il migliore.

Problemi correlati