正在从属性构造函数中检索带注释的方法
本文关键字:注释 方法 检索 从属性 构造函数 | 更新日期: 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)
),找到那些具有候选错误处理程序的类。这减少了维护负担。另一个选项是使用配置文件进行类似操作。