2012-06-25 43 views
4

我有一個問題,在某些情況下(似乎是屬性類型是bool)用於引用屬性的lambda表達式。我用它來獲得它的名字;問題是有時表達式正在被修改爲具有額外的Convert()函數。屬性Lambda表達式獲得額外的轉換(p => p.Property)

例如

GetPropertyName<TSource>(Expression<Func<TSource, object>> propertyLambda) {...} 

var str = GetPropertyName<MyObject>(o=>o.MyBooleanProperty); 

這是怎麼回事認爲propertyLambda看起來像Convert(o.MyBooleanProperty)而不是o.MyBooleanProperty,我所期待。

+0

對不起,這個問題到底有什麼問題? 「Convert」函數來自哪裏? –

+1

我們可以看到GetPropertyName實現代碼 – fenix2222

+0

請參閱「[Stack Overflow不允許在標題中使用標籤](http://meta.stackexchange.com/a/130208)」。 –

回答

3

添加了Convert,因爲o.MyBooleanPropertybool,但結果必須是一個對象。如果你做你的方法一般都在源對象類型和結果類型,那麼就不會有Convert

GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> propertyLambda) 

不幸的是,這意味着你必須明確地指定TResult

GetPropertyName<MyObject, bool>(o => o.MyBooleanProperty) 

如果您不想這樣做,你必須找到一些方法來推斷MyObject,或避免需要它。

例如,如果當前對象是MyObject(和你在一個實例方法),你可以改變你的代碼,以Func<TResult>

GetPropertyName(() => this.MyBooleanProperty) 

或者你也可以包括TSource類型的其他參數將幫助你推斷這種類型:

GetPropertyName(myObject, o => o.MyBooleanProperty) 
+0

非常感謝@svick - 給出你的最後一個例子'GetPropertyName(myObject,o => o.MyBooleanProperty)' - 函數聲明是什麼樣的,我顯然需要添加一個對象參數?另外,是否可以創建一個基於此GetPropertyName((=)this.MyBooleanProperty)示例提供GetPropertyName擴展方法的擴展? – sambomartin

+0

最後一個選項的聲明看起來像'GetPropertyName (TSource obj,Expression > propertyLambda)'。我不確定擴展方法是什麼意思,在這個選項中,你不需要任何實例,它可以是普通的靜態方法。 – svick

+0

感謝您的建議 – sambomartin