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