2011-05-13 62 views
2

是否有可能在一個屬性構造函數來獲取具有分配給它的屬性的類,而不需要在傳遞類名。獲得在C#中的屬性類

[MyAttr] 
    public class A{} 

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] 
    [Serializable] 
    public class MyAttrAttribute: Attribute 
    { 
     public MyAttrAttribute() 
     { 
      //get info here about the class A etc 
     }  
    } 

回答

2

不可以,但爲什麼你想去做這個?你想達到什麼目的?

當您在運行時檢索屬性時,您可以從代表該類的類型對象中執行此操作。所以即使信息沒有存儲在屬性對象中,它也是可用的。

+0

「你從代表該類的類型對象中這樣做」 - 要更清楚一點,你需要從'Type'中獲取屬性,它表示*的所有*實例上課......所以你不一定*有一個實例 – 2011-05-13 06:42:03

+1

爲了審計的目的,我需要在每個類上放置一個屬性,屬性表示審計夥伴類,幾乎在所有情況下,夥伴類的命名與原來的「審計」相同,因此, d喜歡有一個默認的構造函數,當你不給任何賦值時它使用這個默認的約定 – 2011-05-13 06:45:42

+0

@Mark,Type對象並不代表該類的所有實例,它代表了類本身。 @Danielhttp,我會做一個幫手來獲得好友類;該方法將檢索該屬性,並且如果該屬性處於其默認狀態(或者完全缺失),這意味着默認約定。 – phoog 2011-05-13 06:55:33

0

這將是一個方便的功能,很好的問題。但從根本上來說,屬性僅僅意味着檢查員不是檢查員的元數據 - 他們是不變的數據。

3

屬性實例完全獨立於它們修飾的類型/字段/屬性;從屬性訪問上下文絕對沒有辦法。但是,除非使用反射顯式查詢屬性,否則屬性也不會創建爲

如果你想調用一些邏輯,那麼它必須被明確地通過代碼實現 - 那麼你可以考慮在你的屬性接受上下文對象添加一個方法:

public void Invoke(object instance) {...} 

例如,然後使用GetCustomAttribute獲取它,然後調用它,然後調用.Invoke()