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

时间:2008-11-08 09:10:15

标签: c#

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

这样的类
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));
}

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

1 个答案:

答案 0 :(得分:3)

简而言之,你不能从属性构造函数中做到这一点,当构造属性时,它无法访问它所应用的目标方法/类/字段/等。

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