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

C#如何创建通用方法更新对象不同属性 避免编写多个重复方法

C# 重复逻辑代码优化方案

这是典型的「固定判断逻辑+可变操作目标」的重复代码场景,不需要编写多个结构完全一致的方法,通过委托把要操作的属性作为参数传入,就可以把判断逻辑收敛到一个通用方法里。

通用方法实现

直接保留原有判断逻辑,把两个分支要修改的属性读写逻辑通过委托参数传入,不需要引入复杂语法,对初学者友好:

/// <summary>
/// 通用合计值自增方法
/// </summary>
/// <param name="t">要操作的Totals实例</param>
/// <param name="setWhenTrue">条件成立时,给目标属性赋值的委托</param>
/// <param name="getWhenTrue">条件成立时,读取目标属性当前值的委托</param>
/// <param name="setWhenFalse">条件不成立时,给目标属性赋值的委托</param>
/// <param name="getWhenFalse">条件不成立时,读取目标属性当前值的委托</param>
private Totals CalculateTotals(
    Totals t,
    Action<Totals, int> setWhenTrue,
    Func<Totals, int> getWhenTrue,
    Action<Totals, int> setWhenFalse,
    Func<Totals, int> getWhenFalse)
{
    // 原有判断条件完全不需要修改,仅在这里维护一份
    if (/* 填入原判断条件 */)
    {
        setWhenTrue(t, getWhenTrue(t) + 1);
    }
    else
    {
        setWhenFalse(t, getWhenFalse(t) + 1);
    }
    return t;
}

调用方式

原来两个方法的场景都可以直接调用这个通用方法,只需要传入对应要操作的属性即可:

// 对应原calculateTotals方法:操作Total1、Total2
Totals result1 = CalculateTotals(
    t,
    (ins, v) => ins.Total1 = v,
    ins => ins.Total1,
    (ins, v) => ins.Total2 = v,
    ins => ins.Total2
);

// 对应原calculateOtherTotals方法:操作Total3、Total4
Totals result2 = CalculateTotals(
    t,
    (ins, v) => ins.Total3 = v,
    ins => ins.Total3,
    (ins, v) => ins.Total4 = v,
    ins => ins.Total4
);

补充说明

  • 这种写法没有额外性能开销,判断逻辑只维护一份,后续如果要调整判断规则,只需要修改这一个方法即可,不会出现改漏的问题
  • 因为Totals是引用类型,方法内直接修改传入实例的属性就会同步修改外部原对象,保留返回值只是为了和原有代码写法兼容,不需要修改现有调用处的代码
  • 如果后续还要增加Total5/Total6这类同规则的自增需求,只需要在调用时替换传入的属性即可,不需要新增方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:21:29