2014-09-03 96 views
0

在C#4.0中我做了以下內容:在屬性的集合{}方法獲取屬性名

public string PropertyA 
{ 
    get; 
    set 
    { 
    DoSomething("PropertyA"); 
    } 
} 

public string PropertyB 
{ 
    get; 
    set 
    { 
    DoSomething("PropertyB"); 
    } 
} 

..我有很多的這些特性,並做手工將是一個痛苦。有沒有辦法,我可以用這個替換:

public string PropertyA 
{ 
    get; 
    set 
    { 
    DoSomething(GetNameOfProperty()); 
    } 
} 

..可能使用反射?

+2

現在它沒有什麼幫助,但是C#6將具有'nameof'運算符,它將執行類似於您正在查找的內容以及編譯時檢查。 (可以想象,你仍然需要在任何地方編寫屬性名兩次,但編譯器會告訴你是否在某處出現拼寫錯誤。) – 2014-09-03 12:09:12

+0

聽起來像是一個XY問題 - 你想通過這樣做來解決什麼問題? – Sayse 2014-09-03 12:10:07

+2

@Sayse聽起來不像我。這是實現'INotifyPropertyChanged'的常用模式。 – hvd 2014-09-03 12:11:31

回答

2

在.NET 4.5的DoSomething方法應該使用[CallerMemberName]參數屬性:

void DoSomething([CallerMemberName] string memberName = "") 
{ 
    // memberName will be PropertyB 
} 

然後就這樣稱呼它:

public string PropertyA 
{ 
    get 
    { 
     ... 
    } 
    set 
    { 
     DoSomething(); 
    } 
} 

見本MSDN

+0

'CallerMemberNameAttribute'不可用在C#4.0中。 – hvd 2014-09-03 12:13:20

+0

這是否也存在.NET 4.0 – 2014-09-03 12:13:27

+2

它可以用於.NET 4.0,只要您定義自己的'CallerMemberNameAttribute'類型並使用C#5.0編譯器。它只是在C#4.0中不起作用。 – hvd 2014-09-03 12:15:21

0

在當前的C#版本中沒有辦法做到這一點,反射將無濟於事。你可以用表情破解這一點,並得到編譯時檢查,但僅此而已,你必須輸入更多的代碼太

DoSomething(()=>this.PropertyA); // have dosomething take an expression and parse that to find the member access expression, you'll get the name there 

如果可能的話你是使用Postsharp做這方面的一個很好的替代品而是以一種乾淨的方式,但這可能並不總是可能的。

0

您可以使用GetCurrentMethod的反思。

public string PropertyA 
{ 
    get; 
    set 
    { 
     DoSomething(MethodBase.GetCurrentMethod().Name.Substring(4)); 
    } 
} 

它可用於.NET 4

由於@hvd解釋說,該名稱將返回set_PropertyA,然後用Substring採取屬性名稱。

+1

@Sayse當前的方法將是屬性setter,名爲'set_PropertyA'。這也解釋了'.Substring(4)'。 – hvd 2014-09-03 12:17:12

+0

@John,這是你正在尋找的反射? – 2014-09-03 12:42:03