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
相关产品推荐
相关产品推荐

