2011-07-25 4 views
12

私はこのAnnotationクラスを作成しました
この例は、常に例外をスローしますが、まだ私の質問が何であるかを説明しようとしているので、まだ使用しています。 私の注釈は何らかの理由で呼び出されることはありません。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コード。

アトリビュート自体は、誰かが消費しない限り、何もしません。つまり、ある時点の誰かがあなたの属性を発見してから、その上で行動を起こさなければなりません。彼らはあなたの議会の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:はい、可能です。しかし、あなたはあなたのためにそれを構築するための何かが必要です(あなたはそれを自分で行うことができますが、あなたのために利用できるツールがあります)。あなたが探しているものは、あなたのためにプロキシを動的に構築するものです。これらの問題は、しばしばクロスカッティングの問題と呼ばれ、この種のプログラミングはアスペクト指向プログラミングと呼ばれています。たとえば、Castle Windsorの傍受機能を見ると、それがどのようにできるかがわかります。http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason

関連する問題