ser*_*hio 5 .net linq vb.net linq-expressions
我将一些数据从WinGrid转换为表达式,以便将一些输出过滤到用户.我有一个初始集合(MyObjectType),我应用了一些动态过滤器,我获得了一个过滤集合.
我有一个枚举的问题 - MyObjectType的属性.
枚举是标准枚举
Public Enum MyEnum
A
B
C
End Enum
Run Code Online (Sandbox Code Playgroud)
这是我获取表达式的方式:
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
Run Code Online (Sandbox Code Playgroud)
然后发生以下异常:
没有为类型'MyEnum'和'System.Enum'定义二元运算符Equal.
在System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType,String opName,Expression left,Expression right,Boolean liftToNull)at System.Linq.Expressions.Expression.Equal(Expression left,Expression right)

我观察到如果我这样做
expr = Expression.Equal(objectPropertyParam,
Expression.Convert(constantExpression, GetType(MyEnum)))
Run Code Online (Sandbox Code Playgroud)
这个Works,但是我想不要像这样规范每种类型的枚举,因为它是一个通用函数!?
您遇到的问题是Object.Equals和之间的区别MyEnum.Equals。而不是使用Expression.EqualuseExpression.Call来调用常量的Equals方法。
或者,如果这始终使用枚举完成,那么您可以将它们全部安全地转换为整数(或任何最大的支持类型)。然后,您不必硬编码转换为特定枚举 - 它可以与任何基于整数的枚举一起使用。如果它用于枚举以外的东西,那么使用Expression.Call是最好的。
| 归档时间: |
|
| 查看次数: |
2577 次 |
| 最近记录: |