2011-01-05 182 views
23

我打算在不傳遞任何參數的情況下執行此操作!可能嗎?如何獲取屬性設置的屬性名稱?

class MyAtt : Attribute { 
    string NameOfSettedProperty() { 
     //How do this? (Would be MyProp for example) 
    } 
} 

class MyCls { 
    [MyAtt] 
    int MyProp { get { return 10; } } 
} 

回答

5

屬性是應用於類型成員,類型本身,方法參數或程序集的元數據。因爲你有機會獲得元數據,你必須有原成員本身用戶GetCustomAttributes等,即你的Type,例如PropertyInfoFieldInfo

在你的情況,我真的通過屬性的名稱屬性本身:

public CustomAttribute : Attribute 
{ 
    public CustomAttribute(string propertyName) 
    { 
    this.PropertyName = propertyName; 
    } 

    public string PropertyName { get; private set; } 
} 

public class MyClass 
{ 
    [Custom("MyProperty")] 
    public int MyProperty { get; set; } 
} 
+5

謝謝,我知道這可以通過傳遞屬性名稱來解決,我要做到這一點,而不傳遞屬性名稱。所以根據你的回答是不可能的。 – Sadegh 2011-01-05 17:32:01

+0

不可能,屬性不會傳遞有關它們所連接成員的信息。如果'Attribute'實例通過了用於創建它的'ICustomAttributeProvider',但是很遺憾,情況並非如此。 – 2011-01-05 17:34:02

+0

感謝馬修非常有用。 – Sadegh 2011-01-06 05:29:53

0

你不能在屬性類本身內進行。然而,你可以有一個方法,使對象獲得該對象的屬性(如果有的話)使用該屬性的列表。使用此API來實現的是:http://msdn.microsoft.com/en-us/library/ms130869.aspx

+0

好吧我知道有很多方法(像你的方法一樣),但沒有一個是我的情況。 – Sadegh 2011-01-06 05:32:46

95

使用CallerMemberNameAttribute從.NET 4.5:

public CustomAttribute([CallerMemberName] string propertyName = null) 
{ 
    // ... 
} 
+1

太棒了。保存一個參數,我必須使用該參數來修飾整個項目的屬性。 – Ellesedil 2014-01-30 23:08:08

+6

這應該是公認的答案,謝謝! – 2014-03-05 05:44:44

+1

正在尋找這個,但不工作[與枚舉](http://stackoverflow.com/q/28094024/465942)不幸的.. – 2015-03-28 00:34:40