2

我继承了一些遗留代码,其中每个方法都带有:

Method()
{
   Log("Entering");
   ...
   Log("Exiting");
}

那类的东西。这很丑陋,确实重复了大约一千次。有没有办法像 Rails 中的那样添加一个全局“around_filter”?

4

2 回答 2

1

另一种选择是设置一个 Logger 类。就像是:

public static class Logger
{
    public static void Invoke(Delegate del, params object[] args)
    {
        Console.WriteLine("Entering");
        del.DynamicInvoke(args);
        Console.WriteLine("Exiting");
    }

    public static T Invoke<T>(Delegate del, params object[] args)
    {
        Console.WriteLine("Entering");
        T rv = (T)del.DynamicInvoke(args);
        Console.WriteLine("Exiting");
        return rv;
    }
}

然后你可以像这样使用它:

static void Main(string[] args)
{
    Logger.Invoke(new Action<int>(CountTo), 10);
    Console.WriteLine("5 * 2 = {0}", Logger.Invoke<int>(new Func<int, int>(TwiceAsBig), 5));
}

static void CountTo(int num)
{
    for (int i = 1; i <= num; ++i)
        Console.WriteLine(i);
}

static int TwiceAsBig(int num)
{
    return num * 2;
}
于 2012-05-31T01:11:40.987 回答
1

这可以通过面向方面的编程通过诸如PostSharp之类的方面编织工具来完成。对于 PostSharp,OnMethodBoundaryAspect提供了这种类型的功能。

于 2012-05-31T00:22:04.960 回答