c# -使用自定义注解
本文关键字:自定义 | 更新日期: 2023-09-27 18:03:14
我创建了这个Annotation类
这个例子可能没有意义,因为它总是抛出一个异常,但我仍然使用它,因为我只是试图解释我的问题是什么。由于某些原因,我的注释从未被调用有解决方案吗?
public class AuthenticationRequired : System.Attribute
{
public AuthenticationRequired()
{
// My break point never gets hit why?
throw new Exception("Throw this to see if annotation works or not");
}
}
[AuthenticationRequired]
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// My break point get here
}
由于某些原因,我的注释从未被调用,有解决方案吗?
这是对属性的误解。属性的存在是为了有效地将元数据添加到代码的某些部分(类、属性、字段、方法、参数等)。编译器将属性中的信息放入编译器中,并在编译完源代码后将其输出。
属性本身不会做任何事情,除非有人使用它们。也就是说,必须有人在某个时候发现你的属性,然后采取行动。他们坐在你的大会的IL,但他们什么也不做,除非有人找到他们,并采取行动。只有当它们这样做时,属性的实例才会被实例化。实现这一点的典型方法是使用反射。
要在运行时获得属性,必须输入类似
的内容var attributes = typeof(Foo)
.GetMethod("Window_Loaded")
.GetCustomAttributes(typeof(AuthenticationRequired), true)
.Cast<AuthenticationRequired>();
foreach(var attribute in attributes) {
Console.WriteLine(attribute.ToString());
}