C#等价物类似于Rails ActionController类中的around_filter

本文关键字:around filter 等价物 类似于 Rails ActionController | 更新日期: 2023-09-27 18:35:53

我继承了一些遗留代码,每个方法的两侧都有一个:

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

之类的事情。 它很丑陋,确实重复了大约一千次。 有没有办法添加像 Rails 中那样的全局"around_filter"?

C#等价物类似于Rails ActionController类中的around_filter

这可以通过面向方面的编程通过像PostSharp这样的方面编织工具来完成。 在PostSharp的情况下,OnMethodBoundaryAspect提供了这种类型的功能。

另一种选择是设置一个记录器类。 像这样:

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;
}