我有两个具有完全相同代码的事件处理程序,除了处理不同的事件。如何将这些组合使用相同的代码而不必重复自己?
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;
}
}
答案 0 :(得分: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委托类型的差异支持。委托实例可以将任何方法作为目标,该方法接收为委托类型指定的确切类型的参数,或者可以从为委托类型指定的参数分配哪些参数。