使用Delegate在方法入口和出口处执行代码

时间:2011-09-20 18:52:04

标签: c# .net .net-4.0 delegates

我的代码可以执行非常重复的操作,例如记录方法入口和出口。在两者之间,我执行一些业务逻辑。我有办法用代表来处理吗?

这是我到目前为止所拥有的。但是,由于我必须传递的func参数,它确实是限制性的。有人有更好的主意吗?

        Func<Func<int>, int> logAction = new Func<Func<int>, int>(func =>
        {
            try
            {
                Console.WriteLine("Logging...");
                return func();
            }
            finally
            {
                Console.WriteLine("End Logging...");
            }
        });

4 个答案:

答案 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));