如何用C# Switch Case替代If语句处理枚举匹配逻辑?
用Switch-Case重构你的C#邮件逻辑
没问题,咱们一起把这个switch重构和原代码的逻辑问题搞定!
首先拆解下你原代码的问题:第一个if是嵌套结构,当EtapeSuivanteAModifier.Statut匹配Refuse但EtapeActuelle.Statut不匹配AValider2时,第一个if块里的代码不会执行,程序会直接跳到最后的else分支执行不带抄送的邮件发送——这应该就是你说的“不符合预期”的核心原因。
用C# 7及以后版本支持的模式匹配switch就能完美解决这个问题,它允许我们在case里添加额外的判断条件,刚好适配你需要同时校验两个状态的场景。
方案1:基于.Correspond()方法的模式匹配switch
如果你的Statut类没有直接暴露枚举值的属性,直接用Correspond()方法结合switch的when子句即可:
var nextStepStatus = EtapeSuivanteAModifier.Statut; var currentStepStatus = EtapeActuelle.Statut; switch (nextStepStatus) { // 场景1:下一步是Refuse,且当前步骤是AValider2 case var s when s.Correspond(StatutWorkflowEnumValues.Refuse) && currentStepStatus.Correspond(StatutWorkflowEnumValues.AValider2): documentContainer.MailTo(mail.AdressesMailDestinataires, mail.AdressesMailDestinatairesCopies); break; // 场景2:下一步是AValider2 case var s when s.Correspond(StatutWorkflowEnumValues.AValider2): documentContainer.MailTo(mail.AdressesMailDestinataires, mail.AdressesMailDestinatairesCopies); break; // 所有其他情况 default: documentContainer.MailTo(mail.AdressesMailDestinataires); break; }
方案2:直接基于枚举值的switch(更简洁)
如果你的Statut类可以通过某个方法/属性直接获取到StatutWorkflowEnumValues枚举值(比如有个ToEnum()方法或者EnumValue属性),代码会更清爽:
var nextStepEnum = EtapeSuivanteAModifier.Statut.ToEnum(); // 假设存在这个转换方法 var currentStepEnum = EtapeActuelle.Statut.ToEnum(); switch (nextStepEnum) { case StatutWorkflowEnumValues.Refuse when currentStepEnum == StatutWorkflowEnumValues.AValider2: documentContainer.MailTo(mail.AdressesMailDestinataires, mail.AdressesMailDestinatairesCopies); break; case StatutWorkflowEnumValues.AValider2: documentContainer.MailTo(mail.AdressesMailDestinataires, mail.AdressesMailDestinatairesCopies); break; default: documentContainer.MailTo(mail.AdressesMailDestinataires); break; }
为什么这个方案能解决原问题?
这个switch结构会按顺序匹配case:
- 先检查是否满足“下一步是Refuse且当前是AValider2”,满足就执行带抄送的邮件;
- 不满足的话再检查“下一步是AValider2”,满足就执行带抄送的邮件;
- 前两个都不满足,才执行不带抄送的邮件。
完全避免了原代码嵌套if带来的逻辑歧义,结构更清晰,也更容易维护。
内容的提问来源于stack exchange,提问作者Essex
相关产品推荐
相关产品推荐

