2013-05-03 21 views
5

Tôi chuyển đổi một số dữ liệu từ WinGrid thành biểu thức, để lọc một số đầu ra cho người dùng. Tôi có một bộ sưu tập ban đầu (của MyObjectType), tôi áp dụng một số bộ lọc động và tôi có được một bộ sưu tập được lọc.Biểu thức LINQ: Toán tử nhị phân Bằng không được định nghĩa cho các kiểu 'MyEnum' và 'System.Enum'

Tôi gặp sự cố với thuộc tính liệt kê - thuộc tính của MyObjectType.

kiểu liệt kê là một liệt kê tiêu chuẩn

Public Enum MyEnum 
    A 
    B 
    C 
End Enum 

đây là làm thế nào tôi có được các biểu hiện:

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 

thì ngoại lệ sau đây xảy ra:

Nhà điều hành nhị phân bình đẳng không phải là được định nghĩa cho các loại 'MyEnum' và 'System.Enum'.

tại System.Linq.Expressions.Expression.GetEqualityComparisonOperator (ExpressionType binaryType, String opName, Expression trái, biểu đúng, Boolean liftToNull) tại System.Linq.Expressions.Expression.Equal (Biểu trái, biểu đúng)

enter image description here

PS.

tôi quan sát thấy rằng nếu tôi làm

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

này Làm việc, nhưng tôi muốn muốn không specity từng loại enumerations như thế này, vì là một chức năng chung !?

+0

Bạn không thể sử dụng toán tử 'Is'? – Teejay

+0

'Is' ?! không được sử dụng với các biểu thức, nhưng giữa các đối tượng – serhio

+0

Xin lỗi, nó thực sự không rõ ràng những gì bạn đang cố gắng để đạt được – Teejay

Trả lời

1

Sự cố bạn đang gặp phải là sự khác biệt giữa Object.EqualsMyEnum.Equals. Thay vì sử dụng Expression.Equal, hãy sử dụng Expression.Call để gọi phương thức Equals của hằng số.

Ngoài ra, nếu điều này luôn được thực hiện với enums thì bạn có thể chuyển đổi tất cả thành số nguyên một cách an toàn (hoặc bất kỳ kiểu sao lưu lớn nhất nào). Sau đó, bạn không cần phải chuyển đổi mã cứng thành một enum cụ thể - nó sẽ làm việc với bất kỳ enum dựa trên số nguyên nào. Nếu nó được sử dụng cho những thứ bên cạnh enums, sau đó sử dụng Expression.Call là tốt nhất.