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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:12:48