2015-10-13 12 views
0

這是我使用的代碼:我有了一個模型無法投型「System.Linq.Expressions.InstanceMethodCallExpressionN」的對象鍵入「System.Linq.Expressions.MemberExpression

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)我得到一個錯誤,因爲它是允許空值,所以我發現該函數,但有問題將MethodCallExpression投向MethodCallExpression的

+0

你可以提供代碼在哪裏調用ExpresionNullable?你能解釋你想做什麼嗎? –

回答

0

這是我調用該函數的代碼:

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,subObjeto)

當模型有一個允許空值的屬性。

0

而不是ExpresionNullable方法的返回類型是MemberExpression,使其Expression

的方法的簽名應該是這樣的:

Private Function ExpresionNullable(
            contenedor As ParameterExpression, 
            prop As String) As Expression 

您正在試圖創建一個調用使用Expression.Call可空屬性對象的GetValueOrDefault方法的表達。這會創建一個方法調用表達式(MethodCallExpression),它不是MemberExpression(它不能分配給MemberExpression,這就是爲什麼你會得到轉換異常)。 MemberExpression僅適用於訪問字段或屬性的表達式。

此類建議的更改還需要您對GetExpresion方法進行更改。您必須將返回值的類型更改爲Expression。您還必須將exprProp變量的類型更改爲Expression

根據代碼的其餘部分,這些更改可能會影響代碼的其他部分。你可能需要在那裏做類似的改變。

UPDATE:

在我的答案我假設你正在呼籲GetValueOrDefault故意,因爲你想獲得可空屬性類型的默認值,如果屬性的值爲null。

如果你需要表達的訪問可空屬性,而不是它的價值(或者如果它是空的默認設置),則只需刪除ExpresionNullable方法,因爲你不需要它,並與Expression.Property(...更換任何調用它。

+0

我將'MemberExpression'的返回值更改爲'Expression',這似乎工作,謝謝你的想法 –

相關問題