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

时间:2016-02-21 02:00:05

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

我想记录一个方法的开头和结尾,但代码很乱,很难读懂:

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

我想将上述内容转换为

void mymethod()
{
   //dowork
}

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

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

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

2 个答案:

答案 0 :(得分:1)

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

这恰好与实体框架和MVC在解释模型等后用于生成c#的引擎相同。

如果您希望获得有关Microsoft如何运作的官方文档,您还可以在此处阅读Code Generation and T4 Text TemplatesDesign-Time Code Generation by using T4 Text Templates

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

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

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

答案 1 :(得分:0)

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

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