2009-07-22 61 views
5

我創建了一個簡單的屬性:爲什麼我的.NET屬性不執行操作?

[AttributeUsage(AttributeTargets.Method)] 
public class InitAttribute : System.Attribute 
{ 
    public InitAttribute() 
    { 
     Console.WriteLine("Works!"); 
    } 
} 

,我把它應用到一個簡單的方法:

static class Logger 
{ 
    public static string _severity; 

    public static void Init(string severity) 
    { 
     _severity = severity; 
    } 

    [Init()] 
    public static void p() 
    { 
     Console.WriteLine(_severity); 
    } 
} 

這是怎麼回事是相當streight進。只是,我期望該屬性執行一個操作(打印Works!),但這不會發生。

成癮地打印「Works!」當然這只是爲了調試目的:我想訪問實例的屬性_severity(例如,檢查是否= null),但是我一直在閱讀有關屬性的所有內容(這對我而言是非常新的)是關於通過反射訪問'方法或屬性等。一旦我評估了_severity,我如何修改裝飾方法的行爲(在這種情況下,引發異常「記錄器未初始化」並且不執行它)?

任何幫助表示讚賞。

回答

11

如果您需要在控件輸入方法時執行某個操作,則應查看aspect-oriented programming和框架,如PostSharp。屬性不是爲了自己執行任何事情而設計的。它們只是一些數據(或者元數據,如果你願意的話)附加到可以在運行時查詢的IL程序集中的東西。

+7

引起用戶提出這個問題的一件事就是像ASP.Net MVC這樣的框架爲像ActionFilterAttribute這樣的屬性添加鉤子,以便它們看起來可以做某些事情。這鼓勵人們試圖讓正常的屬性變得更加主動。 – 2009-07-24 09:27:02

1

屬性只允許裝飾類型和成員,但屬性本身不能訪問裝飾對象。您必須使用屬性的構造函數參數來傳遞需要在屬性中使用的任何數據。

如果您希望使用屬性自動更改其目標對象的行爲,則必須查看AOP解決方案,如PostSharp

1

該屬性永遠不會被實例化,所以它的構造函數永遠不會被調用。該屬性保持爲元數據,直到您使用反射來檢索它。如前所述,你所追求的是面向方面的編程工具。 PostSharp通過將程序集更改爲後期構建步驟進行工作。如果您使用Castle WindsorUnity控制容器反轉,它們都提供AOP功能。

相關問題