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

本文关键字:出口处 执行 代码 入口 方法 | 更新日期: 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));