C#等价物类似于Rails ActionController类中的around_filter
本文关键字:around filter 等价物 类似于 Rails ActionController | 更新日期: 2023-09-27 18:35:53
我继承了一些遗留代码,每个方法的两侧都有一个:
Method()
{
Log("Entering");
...
Log("Exiting");
}
之类的事情。 它很丑陋,确实重复了大约一千次。 有没有办法添加像 Rails 中那样的全局"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;
}