如果我使用属性注释类的方法,那么我可以检索该类的自定义属性,并查看它是否具有该属性。例如,我正在构建一个面向消息的程序,所以我有像
这样的类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));
}
这至少保留了一个类在该类中的注册,就我而言,这是很好的:)
答案 0 :(得分:3)
简而言之,你不能从属性构造函数中做到这一点,当构造属性时,它无法访问它所应用的目标方法/类/字段/等。
从代码中,我假设您希望代码在启动时自动注册?一种方法可能是探测程序集(一次,在启动时) - 枚举所有类(foreach(Type type in assembly)
),找到具有候选错误处理程序的类。这减少了维护负担。另一种选择是使用配置文件类似的东西。