如何简化两个case仅参数不同的C# switch语句?
完全可以简化,你这里两个分支的核心差异只有文件名,完全可以把差异部分抽出来,公共逻辑只写一次,有三种常用的实现方案:
方案1:C# 8.0+ 支持的switch表达式(最简洁)
直接通过switch表达式映射出目标文件名,非匹配场景返回空,判断有值再执行添加附件逻辑:
var fileName = data.Subscriber.Protocol switch { "email json" => "Očitanje.json", "email text" => "Očitanje.txt", _ => null }; if (fileName != null) { builder.Attachments.Add(fileName, CraftAttachment(data)); }
方案2:兼容旧版本C#的switch写法
如果你的项目用的C#版本低于8.0不支持switch表达式,可以用传统switch先提取后缀:
string fileExt = null; switch (data.Subscriber.Protocol) { case "email json": fileExt = "json"; break; case "email text": fileExt = "txt"; break; default: break; } if (fileExt != null) { builder.Attachments.Add($"Očitanje.{fileExt}", CraftAttachment(data)); }
方案3:字典映射(适合后续扩展)
如果后续可能新增更多协议类型,建议把映射关系提前存在字典里,后续新增只需要改字典配置即可,不用修改逻辑代码:
// 可以提前定义为全局静态只读的映射字典 private static readonly Dictionary<string, string> ProtocolExtensionMap = new Dictionary<string, string> { { "email json", "json" }, { "email text", "txt" } }; // 业务逻辑处调用 if (ProtocolExtensionMap.TryGetValue(data.Subscriber.Protocol, out var ext)) { builder.Attachments.Add($"Očitanje.{ext}", CraftAttachment(data)); }
以上方案都避免了重复编写Attachments.Add的相同逻辑,后续要修改附件添加规则只需要改一处即可,可维护性更高。
内容的提问来源于stack exchange,提问作者forrestDumb
相关产品推荐
相关产品推荐

