3

メソッドが呼び出される前にいくつかの情報を処理する属性を作成しましたが、呼び出されません。

クラスの他のメソッドが呼び出された結果として、処理されてクラスの静的フィールドに格納されたいくつかの値をログに記録したいと思います。

誰かがそれをガイドできます。

[AttributeUsage(AttributeTargets.Method)]
internal class MyAttrib : Attribute
{
    public MyAttrib()
    {
        //This is not getting called. what am i missing
        Console.WriteLine("My Attrib called!!");
    }
}

class MyClass
{
    public MyClass()
    {
        Console.WriteLine("Constructor Created");
    }

    [MyAttrib]
    public int Opt1()
    {
        Console.WriteLine("Op1 Performed");
        return 0;
    }

}

static void Main(string[] args)
{
        MyClass cla = new MyClass();
        cla.Opt1();
        cla.Opt2();
        Console.ReadLine();
}
4

1 に答える 1

5

通常、属性は実行時にインスタンス化されません。リフレクションを使用して、コードのさまざまな部分 (型、フィールドなど) に適用される属性と、属性の内容を取得します。

属性へのアクセスについては、MSDN のこのページを参照してください。具体的には、次のように述べている部分です。


次のような属性指定:

[Author("P. Ackerman", version = 1.1)]
class SampleClass

概念的にはこれと同等です:

Author anonymousAuthorObject = new Author("P. Ackerman");
anonymousAuthorObject.version = 1.1;

ただし、SampleClass の属性がクエリされるまで、コードは実行されません。SampleClass で GetCustomAttributes を呼び出すと、Author オブジェクトが構築され、上記のように初期化されます。


できることの 1 つは、作成する他のすべてのクラスの派生元となる基本クラスを持つことです。この基本クラスのコンストラクターでは、リフレクションを使用して、関心のあるクラスに関する属性やその他の情報を特定し、その情報を使用して何かを行います。

ただし、これは、メソッドが実行される前にいくつかの情報を処理するというあなたの声明に実際には対処していません...それが可能だとは思いません。

于 2013-07-11T14:56:25.203 に答える