2014-12-03 82 views
0

我有兩個事件處理程序具有完全相同的代碼,但處理不同的事件除外。我怎樣才能將這些結合起來使用相同的代碼而不必重複自己?將兩種方法重構爲一個具有相同字段但名稱不同的方法

static void SharePointEventHandler(object sender, SharePointEventArgs e) 
{ 
    switch (e.ExceptionType) 
    { 
     case SharePointEventArgs.ExceptionLevel.Debug: 
      CLog(LogType.Debug, e.Message); 
      break; 

     case SharePointEventArgs.ExceptionLevel.Info: 
      CLog(LogType.Info, e.Message); 
      break; 

     case SharePointEventArgs.ExceptionLevel.Error: 
      CLog(LogType.Error, e.Message, e.Exception); 
      break; 
    } 
} 

static void FTPEventHandler(object sender, FTPEventArgs e) 
{ 
    switch (e.ExceptionType) 
    { 
     case FTPEventArgs.ExceptionLevel.Debug: 
      CLog(LogType.Debug, e.Message); 
      break; 

     case FTPEventArgs.ExceptionLevel.Info: 
      CLog(LogType.Info, e.Message); 
      break; 

     case FTPEventArgs.ExceptionLevel.Error: 
      CLog(LogType.Error, e.Message, e.Exception); 
      break; 
    } 
} 
+1

那些自定義事件參數類型?你能改變事件簽名嗎? – BradleyDotNET 2014-12-03 01:00:42

+1

正如Bradley所問,'SharePointEventArgs'和'FTPEventArgs'之間有什麼關係。有什麼關係嗎?這裏最大的問題是方法體實際上是不相同的。每個使用看起來是'EventArgs'子類特有的'enum'。如果這兩個值以某種方式共享(例如,'enum'被聲明在'EventArgs'子類之外),會更容易。 – 2014-12-03 01:05:31

+1

沒有兩個eventArg類型之間的關係,直接的方法是使用共享邏輯創建第三個方法,並且兩個現有方法都有一個調用它的單獨一行。但這不是您要求的一種方法解決方案。 – hatchet 2014-12-03 01:10:38

回答

3

根據代碼的當前狀態,有多種方法可以重構此代碼。我假設目前,這兩個EventArgs子類根本就沒有關係。恕我直言,最好的辦法是改變這一點。具體而言,創建一個基類,無論是現有的子類的派生:

class ExceptionEventArgs : EventArgs 
{ 
    public enum ExceptionLevel 
    { 
     Debug, 
     Info, 
     Error 
    } 

    public ExceptionLevel ExceptionType { get; set; } 
    public string Message { get; set; } 
    public Exception Exception { get; set; } 
} 

class SharePointEventArgs : ExceptionEventArgs { ... } 
class FTPEventArgs : ExceptionEventArgs { ... } 

然後你可以使用相同的事件處理程序,這兩個事件:

static void SharePointEventHandler(object sender, ExceptionEventArgs e) 
{ 
    switch (e.ExceptionType) 
    { 
     case ExceptionEventArgs.ExceptionLevel.Debug: 
      CLog(LogType.Debug, e.Message); 
      break; 

     case ExceptionEventArgs.ExceptionLevel.Info: 
      CLog(LogType.Info, e.Message); 
      break; 

     case ExceptionEventArgs.ExceptionLevel.Error: 
      CLog(LogType.Error, e.Message, e.Exception); 
      break; 
    } 
} 

這需要對方差支持的優勢。 .NET委託類型。委託實例可以將任何方法作爲目標,該方法接收爲委託類型指定的確切類型的參數,或者可以從爲委託類型指定的參數中指定的參數。

相關問題