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
}

c# -使用自定义注解

由于某些原因,我的注释从未被调用,有解决方案吗?

这是对属性的误解。属性的存在是为了有效地将元数据添加到代码的某些部分(类、属性、字段、方法、参数等)。编译器将属性中的信息放入编译器中,并在编译完源代码后将其输出。

属性本身不会做任何事情,除非有人使用它们。也就是说,必须有人在某个时候发现你的属性,然后采取行动。他们坐在你的大会的IL,但他们什么也不做,除非有人找到他们,并采取行动。只有当它们这样做时,属性的实例才会被实例化。实现这一点的典型方法是使用反射。

要在运行时获得属性,必须输入类似

的内容
var attributes = typeof(Foo)
                    .GetMethod("Window_Loaded")
                    .GetCustomAttributes(typeof(AuthenticationRequired), true)
                    .Cast<AuthenticationRequired>();
foreach(var attribute in attributes) {
    Console.WriteLine(attribute.ToString());
}