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
,这似乎有效,谢谢您的想法