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 对象。


您可能能够做的一件事是拥有一个基类,您创建的所有其他类都从该基类派生。在此基类的构造函数中,使用反射来识别您感兴趣的类的任何属性或任何其他内容,并使用该信息执行某些操作。

这实际上并没有解决您关于在执行方法之前处理一些信息的声明,但是......我不相信这是可能的。

于 2013-07-11T14:56:25.203 回答