使用委托在方法入口和出口处执行代码
本文关键字:出口处 执行 代码 入口 方法 | 更新日期: 2023-09-27 18:09:24
我的代码做了很多重复的事情,比如记录方法的进入和退出。在这两者之间,我执行一些业务逻辑。有没有办法用委托来处理这个?
这是我到目前为止所知道的。然而,由于我必须传递的函数参数,它确实是限制性的。有人有更好的主意吗?
Func<Func<int>, int> logAction = new Func<Func<int>, int>(func =>
{
try
{
Console.WriteLine("Logging...");
return func();
}
finally
{
Console.WriteLine("End Logging...");
}
});
Postsharp非常适合这一点——它是一个面向方面的编程库,具有编译时编织的特性,所以它不会像运行时编织那样影响性能。如果你是AOP新手,这可能解释不了什么,但基本上,它允许你像这样在方法上声明日志记录:
<Logging> //apply an aspect that will log entrance/exit of method
void MyMethod(params)
{
//do something that might throw an exception (or not)
}
有关使用后置字符进行日志记录的示例(和源代码),请参见http://www.sharpcrafters.com/solutions/logging
看起来其中一个AOP框架可以解决您的问题。
private void LogAction(string title, Action action)
{
Logger.Write(string.Format("Entering %0", title));
action();
Logger.Write(string.Format("Leaving %0", title));
}
没有返回值的示例用法:
LogAction("DoSomething", () => DoSomething());
返回值为
的示例用法int intResult = 0;
LogAction("Square", () => intResult = Square(4, 4));
最简单的方法是将所有内容包装在Action中然后在方法
中执行public void log(Action methodToExecute)
{
try
{
Console.WriteLine("Logging...");
methodToExecute();
}
finally
{
Console.WriteLine("End Logging...");
}
}
然后调用它为你的函数创建一个通用动作
//no return
log(() => yourFunciton(optionalParmeters));
//return to something
log(() => someVar = yourFunction(optionalParameters));