gpt4 book ai didi

c# - 记录类名和方法名的最有效方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 17:50:11 32 4
gpt4 key购买 nike

我基本上想编写一个客户记录器/跟踪器,它还记录调用记录器/跟踪器的方法的类和方法名称。这应该很快,这样它就不会影响应用程序的性能,强类型和干净。有没有人有好的想法?

以下是我有的一些,但我担心由于反射导致的性能:

  • StackTrace/StackFrame(开销太大?)

  • MethodInfo.GetCurrentMethod()(还是太慢?而且不是很干净)

  • 将方法作为委托(delegate)传递(C# 可以隐式执行此操作,我可以访问 MethodInfo,但不是很干净)

我感谢任何人的评论。

更新:

我喜欢 StackFrame 的简洁,所以我问了一个更具体的问题 here关于 StackFrame 的性能,我得到了一些非常好的响应,包括性能测试。事实证明,MethodInfo.GetCurrentMethod() 是最快的(在我的电脑上大约需要 1 微秒)并且 new StackFrame(1) 可以按需请求(大约需要 15 -20 微秒在我的电脑上)。我放弃了该方法作为委托(delegate)选项,因为当该方法有多个参数时它太困惑了。

结论:

我已经查看了所有选项,最好的方法是为 PostSharp 编写一个自定义插件,它在编译期间应用自定义属性(如 [Trace])时将方法名称作为字符串注入(inject) MSIL > 到它。在我看来,这是最快和最可维护的选择。这甚至可以实现更多功能,例如在不进行任何反射的情况下传递参数名称和参数,以及自动捕获和记录异常。这my related question获取更多信息。

最佳答案

的确,最快的方法是在编译时执行此操作,但在 .NET 中执行此操作最方便的方法是使用 CallerMemberName , CallerFilePath以及 .NET 4.5 中引入的其他编译器服务属性:

public void TraceMethodCall([CallerMemberName] string methodName = "")
{
}

关于c# - 记录类名和方法名的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1346213/

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