【问题标题】:how to add code at the beginning and end of every method at compile time如何在编译时在每个方法的开头和结尾添加代码
【发布时间】:2016-02-21 02:00:05
【问题描述】:

我想记录一个方法的开始和结束,但是代码很乱,很难阅读:

void mymethod()
{
   LogUtility.EnteringMethod();
   //dowork
   LogUtility.EXitingMethod();
}

我想把上面的转换成只是

void mymethod()
{
   //dowork
}

但在编译/构建时,我想要一个宏/脚本在我的每个方法中添加那些 LogUtility 行。

我知道有面向方面的编程,但我正在寻找一些不太复杂和笨重的东西。

您能推荐一种在编译/构建之前自动生成代码的方法吗?

【问题讨论】:

  • 您正在寻找 PostSharp。
  • 如果您正在寻找更老派的方法 - “记录像依赖注入的横切关注点”可能是一个很好的搜索词(不是很接近您的想法,但可以实现类似的目标) IE stackoverflow.com/questions/7905110/….
  • 看看框架,例如 Fody (free)PostSharp (commercial),它们通过应用编译时编织来提供此功能。
  • @isaias-b 试图远离 postshap,这太过分了。我只想要一个简单的预构建脚本或其他东西
  • @SLaks 我不是,它的方式太过分了

标签: c# .net visual-studio visual-studio-2015 t4


【解决方案1】:

如果你想要一种自动化的方式,像 PostSharp 这样的 AOP 框架几乎是最干净的选择。你可以尝试自己通过反射和属性以及 IL 操作来自动化它,但这并非易事。

如果您想真正保持简单而不使用 100% 自动化,您可以使用带有 Action 参数的包装器方法。这确实不是一个可扩展的解决方案,而且在生产代码可读性方面非常难看。

public void RunMethodWithEntryAndExitLogging(Action methodToExecute)
{
   LogUtility.EnteringMethod(); // use methodToExecute.Method.Name if you need it

   methodToExecute(); // the method that is the actual work

   LogUtility.EXitingMethod();
}

正如我所说,这只是一种快速简单的方法。但可以针对您可能要解决的特定问题完成工作。

【讨论】:

    【解决方案2】:

    我知道这个答案可能会迟到,但在构建时生成代码的解决方案之一是使用T4 Editor

    这恰好是 Entity Framework 和 MVC 在解释您的模型等后用于生成 c# 的同一引擎。

    如果您想了解 Microsoft 提供的有关其工作原理的官方文档,也可以在此处阅读 Code Generation and T4 Text TemplatesDesign-Time Code Generation by using T4 Text Templates

    理论上,您可以创建,例如根据您添加到方法中的属性,甚至在构建和编译时,这样的 .tt 文件可以包含日志记录、授权或其他方便的扩展,然后您的方法才能在您的方法中运行类因此消除了大量样板代码,但维护和调试可能是一项复杂的任务。

    如果您不想自己处理所有这些麻烦,那么您可以使用Post Sharp,正如 Raja Nadar 在他的回答中指出的那样。

    希望这能给你一个开始的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多