2011-07-25 101 views
12

我創建了這個註解類
這個例子可能沒有意義,因爲它總是會拋出異常,但我仍然在使用它,因爲我只是想解釋我的問題是什麼。 由於某些原因,我的註釋永遠不會被調用任何解決方案?C# - 使用自定義註釋?

public class AuthenticationRequired : System.Attribute 
{ 
    public AuthenticationRequired() 
    { 
     // My break point never gets hit why? 
     throw new Exception("Throw this to see if annotation works or not"); 
    } 
} 

[AuthenticationRequired] 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // My break point get here 
} 
+4

在這裏你如何訪問和讀取您的自定義註解:http://msdn.microsoft.com/en-us/library /z919e8tw.aspx#Y109 –

回答

22

我的註釋不會被調用因爲某些原因的任何解決方案?

這是對屬性的一種誤解。有效地存在的屬性可以將元數據添加到代碼的某些部分(類,屬性,字段,方法,參數等)。編譯器將屬性中的信息烘焙到IL中,然後將其烘乾碼。

除非有人使用它們,否則這些屬性本身不會執行任何操作。也就是說,有人在某個時候必須發現你的屬性,然後對其採取行動。他們坐在你的大會的議會中,但除非有人發現並對他們採取行動,否則他們什麼也不做。只有當他們這樣做時,該屬性的一個實例纔會被實例化。這樣做的典型方法是使用反射。

爲了獲得在運行時的屬性,你要這樣說

var attributes = typeof(Foo) 
        .GetMethod("Window_Loaded") 
        .GetCustomAttributes(typeof(AuthenticationRequired), true) 
        .Cast<AuthenticationRequired>(); 

foreach(var attribute in attributes) { 
    Console.WriteLine(attribute.ToString()); 
} 
+0

對不起,如果這不編譯,我沒有編譯器方便。 – jason

+0

感謝您的回答,是否有可能使某個方法具有特定屬性時調用特定的代碼塊?這會被認爲是不好的做法?假設我希望每個具有「Log」屬性的方法記錄時間。我正嘗試使用此方法重用代碼 – aryaxt

+2

@aryaxt:是的,可以這樣做。但是你需要一些東西來爲你構建(你可以自己動手做,但有些工具可以爲你做)。你正在尋找的是爲你動態構建代理的東西。這些問題通常被稱爲交叉問題,這種編程稱爲面向方面編程。例如,如果你看看溫莎堡的攔截功能,你會看到它是如何完成的:http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason