2013-03-27 14 views
6

Załóżmy, że mam następujące wyliczenie.Jak wygenerować wyrażenie dynamiczne za pomocą operatora bitowego i wylicza?

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

Teraz chcę użyć następującego zapytania, aby znaleźć czerwone koszule.

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

I to działa dobrze, ale gdy próbuję skonstruować to dynamicznie:

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

pojawia się następujący wyjątek:

Operator binarny i nie jest zdefiniowany dla typy "MyEnums.Color" i "MyEnums.Color".

Używam .NET 4.5

Wszelkie myśli?

Odpowiedz

8

Spróbuj konwersji koloru i właściwości z typem bazowym przy użyciu Expression.Convert pierwsze:

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 do kompleksowego budynku ekspresji. Zawsze możesz zobaczyć strukturę Wyrażenia używając LINQPad 'Dump' dla' Wyrażenie > exp = shirt => shirt.Color & Color.Red; ' –

+0

Wow, to było szybkie i działa też:) –

+0

@ IvanMilutinović Cieszę się, że działa - minęło kilka lat, odkąd potrzebowałem tej metody i napisałem ją z pamięci tylko ...: o :) –