我继承了一些遗留代码,其中每个方法都带有:
Method()
{
Log("Entering");
...
Log("Exiting");
}
那类的东西。这很丑陋,确实重复了大约一千次。有没有办法像 Rails 中的那样添加一个全局“around_filter”?
我继承了一些遗留代码,其中每个方法都带有:
Method()
{
Log("Entering");
...
Log("Exiting");
}
那类的东西。这很丑陋,确实重复了大约一千次。有没有办法像 Rails 中的那样添加一个全局“around_filter”?
另一种选择是设置一个 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;
}
这可以通过面向方面的编程通过诸如PostSharp之类的方面编织工具来完成。对于 PostSharp,OnMethodBoundaryAspect提供了这种类型的功能。