我的代码可以执行非常重复的操作,例如记录方法入口和出口。在两者之间,我执行一些业务逻辑。我有办法用代表来处理吗?
这是我到目前为止所拥有的。但是,由于我必须传递的func参数,它确实是限制性的。有人有更好的主意吗?
Func<Func<int>, int> logAction = new Func<Func<int>, int>(func =>
{
try
{
Console.WriteLine("Logging...");
return func();
}
finally
{
Console.WriteLine("End Logging...");
}
});
答案 0 :(得分:5)
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)
}
有关使用postsharp进行日志记录的示例(和源代码),请参阅http://www.sharpcrafters.com/solutions/logging
答案 1 :(得分:0)
似乎其中一个AOP框架可以解决您的问题。
答案 2 :(得分:0)
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));
答案 3 :(得分:0)
最简单的方法是将所有内容包装在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));