2010-06-26 48 views
3

的非靜態屬性的名字,我有一個問題,另一個問題非常相似:Get name of property as a stringC#獲取一類

他的解決辦法結束了

// Static Property 
string name = GetPropertyName(() => SomeClass.SomeProperty); 

// Instance Property 
string name = GetPropertyName(() => someObject.SomeProperty); 

我想是有類似靜態屬性但實例屬性的語法。

的原因是,我有一些代碼,現在使用反射來得到一個集合中的所有對象的屬性值,但我已經通過,作爲一個硬編碼字符串。

示例代碼:

double Sum = AmountCollection.Sum("thatfield"); 

那麼這個偉大的工程,但如果「thatfield」是有史以來改名,代碼將不再工作。編譯器無法檢查,因爲它只是一個字符串。此外,獲取引用不會出於同樣的原因。

那麼,有沒有辦法做到很容易地得到一個屬性名稱,目標(即,只是一個函數調用),從實例屬性?

謝謝。

回答

5

試試這個:

string name = GetPropertyName(() => default(SomeClass).SomeInstanceProperty); 

你可能會得到一個編譯器警告有關「總是導致System.NullReferenceException」,但實際上沒有發生,因爲你不執行表達式,這意味着你可以安全地丟棄這個警告。如果你想擺脫它,無論是通過編譯禁用它或者只是移動default()呼叫到一個函數是這樣的:

public static T Dummy<T>() { 
    return default(T); 
} 

string name = GetPropertyName(() => Dummy<SomeClass>().SomeInstanceProperty); 
+0

哦,我喜歡這樣。它確實有效,只是對它進行了測試。我仍然在創建一個對象,但它確實非常乾淨。 謝謝。 – David 2010-06-26 16:09:40

+0

@大衛,不,你沒有創建一個對象。對於所有引用類型,default()都爲null,值類型爲空值(沒有構造函數被調用,沒有堆內存被分配)。 – Lucero 2010-06-26 16:14:03

+0

@ChrisF,正如我寫的,如果表達式被執行過,這個警告是正確的。但是,它僅用於提取元數據,所以這不會發生。 – Lucero 2010-06-26 16:15:04

0

在C#6.0中使用nameof:

nameof(SomeProperty) 

這個表達式在編譯時解決爲「SomeProperty」。