如何在编译时在每个方法的开头和结尾添加代码

how to add code at the beginning and end of every method at compile time

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

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

我想将上面的转换为

void mymethod()
{
   //dowork
}

但是在 compile/build 时间,我想要 macro/script 在我的每个方法中添加那些 LogUtility 行。

我知道有面向方面的编程,但我正在寻找明显不那么复杂和笨拙的东西。

你能推荐一种在 compile/build 之前自动生成代码的方法吗?

如果你想要一种自动的方式,像 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();
}

正如我所说,这是一种快速而简单的方法。但是完成了您可能试图解决的特定问题的工作。

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

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

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

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

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

希望这能给你一个起点。