2010-06-08 68 views
11

說,例如,我有這個簡單的類:獲得的PropertyInfo

public class MyClass 
{ 
    public String MyProperty { get; set; } 
} 

得到的方式,對的PropertyInfo myProperty的是:

typeof(MyClass).GetProperty("MyProperty"); 

這太差勁了!

爲什麼?容易:只要我更改屬性的名稱就會中斷,它需要大量的專用測試來查找使用屬性的每個位置,重構和使用樹無法找到這些類型的訪問。

難道沒有辦法正確訪問一個屬性嗎?什麼,這是在編譯時驗證?
我喜歡這樣的命令:

propertyof(MyClass.MyProperty); 
+3

它變得更糟。如果你看WPF,你會注意到它需要字符串屬性名稱來進行數據綁定,並且在實現INotifyPropertyChanged時也是如此。對於Reflection的用戶來說,這不是一個角落案例,而是一般的日常用例。我目前依靠Resharper來幫助保持同步。 – 2010-06-08 13:31:32

+0

Unitesting在這裏幫了我很多,但多數民衆贊成在... – Enriquev 2010-06-08 13:45:39

+0

相關堆棧溢出問題與更詳細的答案:http://stackoverflow.com/questions/491429/how-to-get-the-propertyinfo-of-a-特定屬性 – 2013-01-19 14:15:19

回答

2

Caliburn項目具有良好的執行什麼您正在尋找照顧INotifyPropertyChanged屬性名稱,您可以調整表達式代碼到您需要做的事情。看看Caliburn.Core.PropertyChangedBase類。

+0

有趣的!這有助於我理解Jon Skeets的答案。 – Sam 2010-06-08 14:39:20

-1

反思的意義就在於能夠在運行時訪問的東西。如果我們假設你的經營者會工作,你已經擁有了班級信息,因此也就擁有了財產,從而使整個事情完全無用。

+0

我已經有了這個屬性?沒有文本中的名字?怎麼樣? – Sam 2010-06-08 13:03:19

6

你能來,此刻最接近的是使用表達式樹:

GetProperty<MyClass>(x => x.MyProperty) 

再吸PropertyInfoGetProperty(你不得不寫)。然而,這有點脆弱 - 沒有編譯時保證表達式樹只是一個屬性訪問。

另一種替代方法是保留您正在使用的可以輕鬆進行單元測試的屬性名稱,並依賴它。

基本上你想要的是神話infoof運營商已經通過C#團隊談了很多次 - 但還沒有取得晉級迄今:(

+0

看起來很有趣 - 但是我怎麼寫GetProperty?我什至不知道*什麼*它是 - 一個通用類?或只是一個通用的方法? infoof聽起來可愛,太糟糕了它還沒有(還)。 – Sam 2010-06-08 13:09:29

0

從這個問題發佈以來,C#6一直在與nameof operator一起發佈。這使得一個物業可以通過以下方式訪問

PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty)); 

如果您重命名該屬性,此代碼將不會編譯(實際上它會,因爲如果重命名正確完成,重命名將更改此行代碼)。