如何在运行时将方法参数嵌入属性名称以精简重复代码?
代码精简方案
1. 先封装Line数据结构
把原来零散的Line1X、Line1Y、Line2X、Line2Y打包成一个类,让数据管理更清晰:
public class Line { public int X { get; set; } public int Y { get; set; } }
然后把原来的单个属性替换成Line对象集合,比如:
// 替代原来的Line1X、Line1Y、Line2X、Line2Y private Line[] _lines = new Line[] { new Line(), // 对应原Line1的X、Y new Line() // 对应原Line2的X、Y };
2. 抽离重复逻辑,统一处理
接下来把嵌套switch里的重复代码抽出来,先根据lineNo拿到对应的Line对象,再统一处理参数的增减逻辑:
Line targetLine = null; switch (lineNo) { case "Line 1": targetLine = _lines[0]; break; case "Line 2": targetLine = _lines[1]; break; } if (targetLine == null) return; // 所有Line的参数处理逻辑只写一次 switch (parameter) { case "DecX": if (targetLine.X > 0) targetLine.X -= 1; break; case "IncX": if (targetLine.X < LabelWidth) targetLine.X += 1; break; case "DecY": if (targetLine.Y > 0) targetLine.Y -= 1; break; case "IncY": if (targetLine.Y < LabelHeight) targetLine.Y += 1; break; }
3. 进阶优化(可选)
如果以后要加更多Line,用字典映射lineNo和Line对象,就不用每次新增都修改switch了:
// 提前初始化字典 private Dictionary<string, Line> _lineMap = new Dictionary<string, Line>() { {"Line 1", new Line()}, {"Line 2", new Line()} }; // 直接通过lineNo取目标Line,取不到就直接返回 if (!_lineMap.TryGetValue(lineNo, out var targetLine)) return; // 后面的参数处理逻辑和上面完全一样
这样改完之后,不管有多少条Line,参数处理的核心逻辑只需要写一遍,既消除了重复代码,后续维护也更方便。
内容的提问来源于stack exchange,提问作者Formant
相关产品推荐
相关产品推荐

