C# 为什么我的.NET属性不执行操作?

C# 为什么我的.NET属性不执行操作?,c#,reflection,attributes,C#,Reflection,Attributes,我创建了一个简单的属性: [AttributeUsage(AttributeTargets.Method)] public class InitAttribute : System.Attribute { public InitAttribute() { Console.WriteLine("Works!"); } } 我将其应用于一个简单的方法: static class Logger { public static string _sever

我创建了一个简单的属性:

[AttributeUsage(AttributeTargets.Method)]
public class InitAttribute : System.Attribute
{
    public InitAttribute()
    {
        Console.WriteLine("Works!");
    }
}
我将其应用于一个简单的方法:

static class Logger
{
    public static string _severity;

    public static void Init(string severity)
    {
        _severity = severity;
    }

    [Init()]
    public static void p()
    {
        Console.WriteLine(_severity);
    }
}
正在发生的事情很快就过去了。只是,我希望该属性执行一个操作(打印工作!),但这不会发生

令人上瘾的是,打印“Works!”当然只是为了调试目的:我想访问实例的属性
\u severity
(例如,检查is!=null),但我一直在读到的关于属性(对我来说很新)的所有内容都是关于通过反射访问类的方法或属性等等。一旦我评估了
\u严重性
,我如何修改修饰方法的行为(在这种情况下,引发异常“Logger未初始化”并且不执行它)


非常感谢您的帮助。

如果您需要在控件进入方法时执行操作,您应该查看和框架,例如。属性本身并不是用来执行任何操作的。它们只是一组附加到IL程序集中的数据(或元数据,如果您愿意),可以在运行时查询。

属性只允许修饰类型和成员,但属性本身无法访问修饰对象。您必须使用属性的构造函数参数来传递在属性中处理所需的任何数据


如果您希望使用属性来自动改变其目标对象的行为,则必须查看AOP解决方案,如。

该属性从未实际实例化,因此从未调用其构造函数。在使用反射检索该属性之前,该属性将保持为元数据。正如前面提到的,您所追求的是一个面向方面的编程工具。PostSharp的工作原理是将部件更改为构建后步骤。如果您使用的是或反转控件容器,那么它们都提供AOP功能。

导致用户提出这个问题的一个原因是ASP.Net MVC等框架在ActionFilterAttribute等内容中为属性添加了钩子,因此它们似乎在做些什么。这鼓励人们尝试让正常属性变得更加主动。