2010-03-29 63 views
2

我正致力於一個名爲Fasterflect的圖書館,其目的是「改善開發者使用反思的經驗」。因此,它提供了建立在經典反射之上的抽象,並將用於完全相同的場景。圖書館開發 - 尋找建議功能的有效用例

以下所示爲通過對象實例訪問成員當前語法:

obj.SetPropertyValue("PropertyWithPrivateSetter", "foo"); 
obj.SetFieldValue("_readOnlyIntegerProperty", 123); 

一個用戶已經建議我們添加用於基於lamdba訪問支持(類似於流利休眠):

obj.SetPropertyValue<MyClass>(x => x.PropertyWithPrivateSetter, "foo"); 
obj.SetFieldValue<MyClass>(x => x.ReadOnlyInteger, Access.CamelCaseField(Prefix.Underscore), 123); 

由於反射通常是在編譯時不知道的類型上執行的,因此我很難考慮這種情況,因爲這樣做會很有用。我只是缺乏想象力嗎?在編譯時知道類型的反射是否存在有效的場景?

對於原始建議this NBuilder feature request有一些額外的上下文,您也可以查看Fasterflect feature request

+0

此功能是否實施過?我似乎無法找到任何具有類似簽名的方法。 – 2012-03-16 15:00:56

+0

我們考慮過但認爲創建和支持這項工作所付出的努力並不值得。有關此問題的更多信息,請訪問http://fasterflect.codeplex.com/workitem/5622 – 2012-03-16 18:41:14

回答

3

主要的使用場景將會是你所描述的一個場景:一個擁有公共獲取者但是私人設置者的屬性。通過使用lambda表達式,可以提供對屬性名稱的編譯時檢查(即:沒有魔術字符串),但仍提供了通過反射設置「只讀」屬性的方法。

+0

我可以看到,這可能是一個有效的用例。然而,我正在尋找的是能夠幫助我確定建議的語法是否有改進的東西。你會認爲第二個例子比第一個例子好嗎?是否反映了您在編譯時知道的一種常見情況? – 2010-03-29 19:57:53

+0

@Morten:對於這個特定的用例,這是一個改進。這比原始語法的優點是不需要字符串。這意味着,例如,重命名變量的重構不會破壞代碼。另外,這仍然可以在混淆後使用,在混淆處理期間使用字符串會「破壞」。 – 2010-03-29 20:01:01

+0

好的重構工具也會更新註釋和文字,儘管我同意對於屬性訪問它是一種改進。雖然不相信字段語法。 – 2010-03-29 20:15:16

0

爲了擴展Reed所說的(他比我輸入的內容更簡潔),一個非常有效的場景是「只讀工廠」,它提供真正的只讀上下文或提供真正的只讀上下文只讀對象的特性,並避免構造器設置(即真正的密封類)。

+0

是的,這確實聽起來像是一個可能的用例。 – 2010-03-29 20:01:34