gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:50:58 25 4
gpt4 key购买 nike

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

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));
}

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

最佳答案

简而言之,您不能从属性构造函数中执行此操作,当构造属性时,它无法访问它所应用到的目标方法/类/字段/等。

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

关于c# - 从属性构造函数中检索带注释的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com