2013-03-27 14 views
6

Diciamo che ho il seguente enum.Come generare un'espressione dinamica con un operatore ed enumerazione bit a bit?

[Flags] public enum Color { Red = 1, Blue = 2, Green = 4 } 

Ora, desidero utilizzare la seguente query per trovare le camicie rosse.

Shirts.Where(x => (x.Color & Color.Red) != 0) 

E funziona bene, ma quando provo a costruire questo in modo dinamico:

var color= Expression.Constant(Color.Red); 
var property = Expression.Property(Expression.Parameter(typeof(Shirt)), "Color"); 
Expression.NotEqual(Expression.And(property, color), Expression.Constant(0)); 

ottengo la seguente eccezione:

L'operatore binario e non è definito per i tipi "MyEnums.Color" e "MyEnums.Color".

sto usando .NET 4.5

Qualche idea?

risposta

8

Prova conversione colore e struttura al tipo sottostante usando Expression.Convert primo:

var color= Expression.Constant(Color.Red); 
var property = Expression.Property(Expression.Parameter(typeof(Shirt)), "Color"); 
var colorValue = Expression.Convert(color, Enum.GetUnderlyingType(typeof(Color))); 
var propertyValue = Expression.Convert(property, Enum.GetUnderlyingType(typeof(Color))); 
Expression.NotEqual(Expression.And(propertyValue, colorValue), Expression.Constant(0)); 
+0

+1 per edilizia un'espressione complessa. Puoi sempre vedere la struttura di Expression usando LINQPad 'Dump' per' Expression > exp = shirt => shirt.Color & Color.Red; ' –

+0

Wow, è stato veloce, e funziona anche: –

+0

@ IvanMilutinović Sono contento che funzioni - sono passati un paio d'anni da quando avevo bisogno di quel metodo e l'ho scritto solo dalla memoria ...: o :) –