我繼承有與兩側的每一個方法的一些遺留代碼:什麼是類似於Rails ActionController類中找到的around_filter的C#等價物?
Method()
{
Log("Entering");
...
Log("Exiting");
}
之類的事情。這是醜陋的,確實重複了一千次。有沒有辦法添加一個像Rails中找到的全局「around_filter」?
我繼承有與兩側的每一個方法的一些遺留代碼:什麼是類似於Rails ActionController類中找到的around_filter的C#等價物?
Method()
{
Log("Entering");
...
Log("Exiting");
}
之類的事情。這是醜陋的,確實重複了一千次。有沒有辦法添加一個像Rails中找到的全局「around_filter」?
這可以通過Aspect Oriented Programming通過方面編織工具如PostSharp完成。在PostSharp的情況下,OnMethodBoundaryAspect提供了這種類型的功能。
另一種選擇是設置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;
}
請注意,如果您使用'Invoke
如何去除來電,但是僅把它留在在有意義的地方?當拋出異常時,你確實有調用堆棧,所以你不一定需要爲每個方法都這樣做。 –
@BryanCrosby嗯,在這種情況下,這是一個選項,但這並不是我真正想問的。 – jordanpg