2012-03-16 9 views
1

ヒットしたときにコンソールに書き込むカスタム属性を作成しましたが、ヒットしないようです。それはマイクロソフトのチュートリアル(http://msdn.microsoft.com/en-us/library/sw480ze8.aspx)で、2010年に実行されています.net 4。私はそれが私に間違ったことをしているに違いないと思っていますが、私はそれが何かを見ることができません。誰も助けることができますか?カスタム属性がヒットしない

これはコード

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] 
public class Author : Attribute 
{ 
    private string _name; 
    private double _version; 

    public Author(string name) 
    { 
     Console.WriteLine(string.Format("author {0} was just created", name)); 

     _name = name; 
     _version = 1.0; 
    } 
} 

これは、それを使用するクラスでヒットしないさん属性、である - それは成功したコンストラクタでコードを書いています:

/// <summary> 
/// TODO: Update summary. 
/// </summary> 
[Author("P. Ackerman")] 
public class Ackerman 
{ 
    public Ackerman() 
    { 
     Console.WriteLine("I created Ackerman."); 
    } 
} 

をそして、これがあるとそれを呼び出すコンソールアプリケーションは、新しいAckerman()コンストラクタでコードを正常に印刷しています:

​​

ありがとう!!

+0

属性はタイプのインスタンスに対してタイプの定義に反しないトリガされます

var attrib = author1.GetType().GetCustomAttributes(false); 

このコード:だけにしますが、特にこのようにそれらを要求しますあなたがそれを検査しようとしない限り、 – kaj

答えて

3

クラスの属性のインスタンスは作成されず、クラスのインスタンスが作成されます。あなたは属性コンストラクタが呼び出され表示されませんのでごConsole.WriteLine(string.Format("author {0} was just created", name));

+0

それをありがとう - あなたはまったく正しい。しかし、別に呼び出す必要がある場合、属性を持つことのポイントは何ですか? – rozza

+1

属性は通常、宣言型プログラミングの多くの状況で役立ちます。 Serializable、DataMember、ServiceContractなどのいくつかの標準属性について読むことができます。たとえば、Author属性を使用して、特定の著者のすべてのクラスを表示することができます。また、Aspect Orientedプログラミングについても読んでください。なぜなら、Aspect Orientedプログラミングは、あなたが属性でしようとしたこととほぼ同じです – Nikolay

関連する問題