You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统一管理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);
}

说明

  1. 核心方法ExecuteAndUpdateStatus负责所有通用逻辑:异常捕获、根据执行结果更新状态文本。
  2. 每个重载版本仅用lambda表达式将原委托的调用逻辑封装为无参Func<bool>,并传入原委托的Method属性(用于异常信息中的方法名),其余逻辑全由核心方法处理。
  3. 后续若需修改状态更新逻辑(如调整异常信息格式、增加日志记录),只需修改ExecuteAndUpdateStatus一个方法,所有重载版本会自动同步变化。

内容的提问来源于stack exchange,提问作者MDD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:05:27