2012-05-31 38 views
2

我繼承有與兩側的每一個方法的一些遺留代碼:什麼是類似於Rails ActionController類中找到的around_filter的C#等價物?

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

之類的事情。這是醜陋的,確實重複了一千次。有沒有辦法添加一個像Rails中找到的全局「around_filter」?

+0

如何去除來電,但是僅把它留在在有意義的地方?當拋出異常時,你確實有調用堆棧,所以你不一定需要爲每個方法都這樣做。 –

+0

@BryanCrosby嗯,在這種情況下,這是一個選項,但這並不是我真正想問的。 – jordanpg

回答

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

請注意,如果您使用'Invoke (動作 del,T arg)'和'Invoke (動作 del,T arg1,U arg2)'重載定義Invoke,則可以將其稱爲:Logger.Invoke (CountTo,10)',這有點更好閱讀... –

相關問題