Vb.net 无法强制转换类型为';System.Linq.Expressions.InstanceMethodCallExpressionN';输入';System.Linq.Expressions.MemberExpression
这是我正在使用的代码:Vb.net 无法强制转换类型为';System.Linq.Expressions.InstanceMethodCallExpressionN';输入';System.Linq.Expressions.MemberExpression,vb.net,expression,Vb.net,Expression,这是我正在使用的代码: Private Function ExpresionNullable(contenedor As ParameterExpression, prop As String) As MemberExpression Dim member As Expression member = Expression.PropertyOrField(contenedor, prop) Dim typeIfNullable As Type = Nullable.Ge
Private Function ExpresionNullable(contenedor As ParameterExpression, prop As String) As MemberExpression
Dim member As Expression
member = Expression.PropertyOrField(contenedor, prop)
Dim typeIfNullable As Type = Nullable.GetUnderlyingType(member.Type)
If typeIfNullable IsNot Nothing Then
Dim callexpression As MethodCallExpression = Expression.Call(member, "GetValueOrDefault", Type.EmptyTypes)
member = callexpression
End If
Return member
End Function
我有一个模型有这样一个属性:
Public property price As Decimal?
当我尝试使用这个属性时:exprPropiedad=Expression.property(exprPropiedad,prop)
我得到一个错误,因为它允许为null,因此,我找到了该函数,但在将MethodCallExpression强制转换为MethodCallExpression时遇到问题。这是我调用该函数的代码:
Function GetExpresion(cont As ParameterExpression, props As String, subObject As IEnumerable(Of String)) As MemberExpression
Dim exprProp As MemberExpression = Nothing
If subObject IsNot Nothing Then
For Each subObjeto In subObject
If exprProp Is Nothing Then
exprProp = Expression.Property(cont, subObject)
Else
exprProp = Expression.Property(exprProp, subObjeto)
End If
Next
End If
If exprProp Is Nothing Then
exprProp = ExpresionNullable(cont, props)
Else
exprProp = Expression.Property(exprProp, props)
End If
Return exprProp
End Function
一般来说,我需要的是一些简单的东西,需要使用这个
Expression.Property(exprPropiedad,subbjecto)
当模型具有允许空值的属性时 将
ExpresionNullable
方法的返回类型改为MemberExpression
,将其改为Expression
方法的签名应如下所示:
Private Function ExpresionNullable(
contenedor As ParameterExpression,
prop As String) As Expression
您正在尝试创建一个表达式,该表达式使用expression.Call
对可为空的属性对象调用GetValueOrDefault
方法。这将创建一个方法调用表达式(MethodCallExpression
),该表达式不是MemberExpression
(它不可分配给MemberExpression
,这就是为什么会出现强制转换异常)<代码>成员表达式仅用于访问字段或属性的表达式
这种建议的更改还需要您在GetExpresion
方法中进行更改。必须将返回值的类型更改为Expression
。您还必须将exprProp
变量的类型更改为表达式
根据代码的其余部分,此类更改可能会影响代码的其他部分。您可能需要在那里进行类似的更改
更新:
在我的回答中,我假设您有意调用GetValueOrDefault
,因为如果属性的值为null,您希望获取可为null的属性类型的默认值
如果您需要表达式来访问nullable属性,而不是它的值(如果它为null,则为默认值),则只需删除
ExpresionNullable
方法,因为您不需要它,并用expression.property替换对它的任何调用(…
您能提供调用ExpresionNullable的代码吗?您能解释一下您想做什么吗?我将返回值MemberExpression
更改为Expression
,这似乎有效,谢谢您的想法