如何统一管理C#中重载的functionDecorator函数?
重构C#重载的functionDecorator以消除代码重复
问题背景
现有一组重载的functionDecorator方法,用于接收不同参数数量的Func<bool>类型委托,通过try-catch处理执行结果并更新txtStatusBar文本。但每个重载的核心逻辑(try-catch块、状态文本更新)完全重复,修改时需要在多个版本中同步代码,维护成本高。曾尝试用dynamic处理但未成功。
原代码示例:
public void funtionDecorator(Func<bool> Func, string successText = "success", string failText = "fail", string errorText = "error") { try { if (Func()) { txtStatusBar.Text = successText; } else { txtStatusBar.Text = failText; } } catch(Exception ex) { txtStatusBar.Text = errorText + Func.Method.Name + ex.ToString(); } } // ex : funtionDecorator<DataTable>(useDataFuntion, dt); public void funtionDecorator<T>(Func<T, bool> Func, T type, string successText = "success", string failText = "fail", string errorText = "error") { try { if (Func(type)) { txtStatusBar.Text = successText; } else { txtStatusBar.Text = failText; } } catch (Exception ex) { txtStatusBar.Text = errorText + Func.Method.Name + ex.ToString(); } } // ex : funtionDecorator<DataTable, Double>(useDataFuntion, dt, value); public void funtionDecorator<T1, T2>(Func<T1, T2, bool> Func, T1 type1, T2 type2, string successText = "success", string failText = "fail", string errorText = "error") { try { if (Func(type1, type2)) { txtStatusBar.Text = successText; } else { txtStatusBar.Text = failText; } } catch (Exception ex) { txtStatusBar.Text = errorText + Func.Method.Name + ex.ToString(); } }
解决方案
重构思路
将重复的try-catch和状态更新逻辑抽离为一个通用核心方法,各个重载版本仅需将特定参数的委托调用逻辑包装成无参Func<bool>,再传入核心方法即可。这样所有异常处理和状态更新逻辑都在一处维护,修改时只需改动核心方法。
重构后的代码
// 核心通用方法:统一处理异常捕获与状态文本更新 private void ExecuteAndUpdateStatus(Func<bool> executionFunc, MethodInfo methodInfo, string successText, string failText, string errorText) { try { txtStatusBar.Text = executionFunc() ? successText : failText; } catch (Exception ex) { txtStatusBar.Text = $"{errorText}{methodInfo.Name}{ex.ToString()}"; } } // 无参委托重载 public void funtionDecorator(Func<bool> Func, string successText = "success", string failText = "fail", string errorText = "error") { ExecuteAndUpdateStatus(() => Func(), Func.Method, successText, failText, errorText); } // 单参数委托重载 public void funtionDecorator<T>(Func<T, bool> Func, T type, string successText = "success", string failText = "fail", string errorText = "error") { ExecuteAndUpdateStatus(() => Func(type), Func.Method, successText, failText, errorText); } // 双参数委托重载 public void funtionDecorator<T1, T2>(Func<T1, T2, bool> Func, T1 type1, T2 type2, string successText = "success", string failText = "fail", string errorText = "error") { ExecuteAndUpdateStatus(() => Func(type1, type2), Func.Method, successText, failText, errorText); }
说明
- 核心方法
ExecuteAndUpdateStatus负责所有通用逻辑:异常捕获、根据执行结果更新状态文本。 - 每个重载版本仅用lambda表达式将原委托的调用逻辑封装为无参
Func<bool>,并传入原委托的Method属性(用于异常信息中的方法名),其余逻辑全由核心方法处理。 - 后续若需修改状态更新逻辑(如调整异常信息格式、增加日志记录),只需修改
ExecuteAndUpdateStatus一个方法,所有重载版本会自动同步变化。
内容的提问来源于stack exchange,提问作者MDD
相关产品推荐
相关产品推荐

