正在从属性构造函数中检索带注释的方法

本文关键字:注释 方法 检索 从属性 构造函数 | 更新日期: 2023-09-27 17:48:50

如果我用属性注释类的方法,那么我可以检索该类的自定义属性,并查看它是否具有该属性。例如,我正在构建一个面向消息的程序,所以我有像这样的类

public class ErrorHandler
{
  [HandleMessage(ErrorHandling.ERROR)]
  private static void OnError(string message, object context, params object[] args)
  {
    Exception e;
    args.Extract(out e);
    Console.WriteLine(e.Message + Environment.NewLine + e.StackTrace);
  }
}

在运行时,我可以这样做:

public static void RegisterStaticHandlers(Type type)
{
  foreach (var mInfo in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static))
  {
    var mAttr = mInfo.GetCustomAttribute<HandleMessageAttribute>();
    if (mAttr != null)
      RegisterInstanceHandler(mAttr.Message, mInfo.CreateDelegate<MessageHandler>());
  }
}

(我有一些扩展方法来简化代码,它们现在不相关了。)

我的问题是:我可以完全去掉这个RegisterStaticHandlers方法,并在属性构造函数中注册处理程序吗?

public class HandleMessageAttribute : Attribute
{
  public string Message { get; private set; }
  public HandleMessageAttribute(string message)
  {
    Message = message;
    Messages.RegisterInstanceHandler(message, ... method reference here ...);
  }
}

有没有一种方法可以检索由属性构造函数中的属性注释的方法,而不是相反的(常规的)方法来拥有该方法并获取其属性?

[已编辑]我刚刚意识到我至少可以在静态构造函数中做到这一点:

static ErrorHandler()
{
  Messages.RegisterStaticHandlers(typeof(ErrorHandler));
}

这至少将类的注册保留在该类中,就我而言这很好:)

正在从属性构造函数中检索带注释的方法

简而言之,你不能从属性构造函数中完成,当构建属性时,它无法访问它所应用的目标方法/class/field等。

从代码中,我假设您希望代码在启动时自动注册?一种方法可能是探测程序集(在启动时一次)-枚举所有类(foreach(Type type in assembly)),找到那些具有候选错误处理程序的类。这减少了维护负担。另一个选项是使用配置文件进行类似操作。