我想记录一个方法的开头和结尾,但代码很乱,很难读懂:
void mymethod()
{
LogUtility.EnteringMethod();
//dowork
LogUtility.EXitingMethod();
}
我想将上述内容转换为
void mymethod()
{
//dowork
}
但是在编译/构建时,我想要一个宏/脚本在我的每个方法中添加 LogUtility 行。
我知道有面向方面的编程,但我正在寻找一些明显不那么复杂和笨重的东西。
你能推荐一种在编译/构建之前自动生成代码的方法吗?
答案 0 :(得分:1)
我知道这个答案可能会迟到,但在构建时生成代码的解决方案之一就是使用T4 Editor。
这恰好与实体框架和MVC在解释模型等后用于生成c#的引擎相同。
如果您希望获得有关Microsoft如何运作的官方文档,您还可以在此处阅读Code Generation and T4 Text Templates,Design-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();
}
正如我所说,这只是一种快速而简单的方法。但是要为你可能要解决的特定问题完成工作。