0

私はこの単純なプログラムを持っていますが、問題はコードが TestClassAttribute クラスに到達しないことです。コンソール出力は次のとおりです。

init
executed
end

コード

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("init");
        var test = new Test();
        test.foo();
        Console.WriteLine("end");
        Console.ReadKey();
    }
    public class TestClassAttribute : Attribute
    {
        public TestClassAttribute()
        {
            Console.WriteLine("AttrClass");
            Console.WriteLine("I am here. I'm the attribute constructor!");
            Console.ReadLine();
        }
    }

    public class Test
    {
        [TestClass]
        public void foo()
        {
            Console.WriteLine("executed");
        }
    }
}
4

4 に答える 4

3

おそらく属性クラスはどのように機能しますか?を読む必要があります。.

オブジェクトのインスタンスごとに 1 つではなく、1 つの静的インスタンスではなく、それらが適用されるオブジェクトを作成するときにインスタンス化されません。適用されるクラスにもアクセスしません。

クラス、メソッド、プロパティなどの属性のリストを取得しようとすることができます。これらの属性のリストを取得すると、ここでインスタンス化されます。次に、これらの属性内のデータを操作できます。

于 2013-06-26T20:03:21.763 に答える
2

属性はそれ自体では何もしません。特定のクラス/メソッドの属性を要求する前に、それらは構築されません。

したがって、コードに「AttrClass」を記述するには、fooメソッドの属性を明示的に要求する必要があります。

于 2013-06-26T20:03:51.057 に答える
0

いいえ、いいえ。属性は特別です。それらのコンストラクターは、リフレクションを使用してそれらに到達するまで実行されません。その場合、実行する必要はありません。たとえば、次の小さなメソッドは属性に反映されます。

public static string RunAttributeConstructor<TType>(TType value)
{
    Type type = value.GetType();
    var attributes = type.GetCustomAttributes(typeof(TestClassAttribute), false);
}

Main属性のコンストラクターでこれを呼び出す場所がどこでも実行されることがわかります。

于 2013-06-26T20:07:08.450 に答える