为什么我的.NET属性不执行操作?
我创建了一个简单的属性:
[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!),但这不会发生。
上瘾,打印“作品!” 当然只是为了调试目的:我想访问实例的属性_severity
(例如,检查是否是!= null),但我一直在阅读的有关属性的内容(对我来说很新)是关于通过reflection访问类的方法或属性等。 一旦我评估了_severity
,我怎样才能修改修饰方法的行为(在这种情况下,引发exception“Logger未初始化”并且不执行它)?
任何帮助赞赏。
如果您需要在控件进入方法时执行操作,则应该查看面向方面的编程和框架,例如PostSharp 。 属性不是为了自己执行任何操作而设计的。 它们只是一堆数据(或元数据,如果你愿意)附加到IL程序集中的东西,可以在运行时查询。
属性仅允许装饰类型和成员,但属性本身无法访问装饰对象。 您必须使用属性的构造函数参数来传递您在属性中使用所需的任何数据。
如果您希望使用属性来自动更改其目标对象的行为,则必须查看PostSharp之类的AOP解决方案。
该属性从未实际实例化,因此永远不会调用其构造函数。 该属性保留为元数据,直到您使用reflection来检索它。 如前所述,您所追求的是面向方面的编程工具。 PostSharp通过将程序集更改为构建后步骤来工作。 如果您使用Castle Windsor或Unity Inversion of Control Containers,它们也都提供AOPfunction。