2013-03-27 32 views
6

假設我有以下枚舉。如何使用按位運算符和枚舉生成動態表達式?

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

現在,我想使用以下查詢來查找紅襯衫。

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

,它工作得很好,但是當我嘗試動態構建這樣的:

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

我得到以下異常:

二元經營者和無定義類型'MyEnums.Color' 和'MyEnums.Color'。

我使用.NET 4.5

有什麼想法?

回答

8

嘗試使用Expression.Convert第一轉換顏色和屬性爲基礎類型:

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爲複雜的表達式建築物。您可以隨時使用LINQPad'Dump'查看錶達式的結構,用於表達式> exp = shirt => shirt.Color&Color.Red;' – 2013-03-27 14:11:22

+0

哇,這很快,也很有效: ) – 2013-03-27 14:14:26

+0

@IvanMilutinović很高興它的工作原理 - 我需要這種方法已經有幾年了,而且我只是從記憶中寫下來的......:o :) – 2013-03-27 14:16:32