【问题标题】:how to make switch statement generic in c#如何在c#中使switch语句通用
【发布时间】:2010-08-19 08:29:55
【问题描述】:

我想在 c# 中使用 switch 语句。但是我不想在 case 表达式中使用常量,而是想使用枚举值。我该如何使用它。如果我尝试像这样使用它:

 string strPageMode=...//some value;
 switch (strPageMode)
 {
     case ModesEnum.SystemHealth:
     //some code
     break;
}

给出错误。那有什么用呢?我不想使用 If 语句。

【问题讨论】:

  • 提问时,请说明实际错误,而不仅仅是说“给出错误”。
  • 好的,谢谢你的建议......但是你有什么答案吗?

标签: c# switch-statement


【解决方案1】:

如果它是一个字符串,那么这将起作用:

ModesEnum res;

//Implicit generic as opposed to Enum.Parse which returns object
Enum.TryParse(strPageMode, out res); //returns false if parsing failed

switch (res)
{
    case ModesEnum.SystemHealth:
        break;
}

如上所述,通用 TryParse< .Net 4.0 中不可用。否则,请使用Enum.Parse

【讨论】:

  • @leppie 我看到你已经提出了另一个问题。如果给您带来不便或困惑,我深表歉意:-/
【解决方案2】:

strPageMode 是如何声明的?它必须是ModesEnum 的实例,我猜它是一个字符串。

【讨论】:

  • 下次请将此作为评论 :)
  • 我想这也是答案。
  • 嗯,公平。我想这取决于问题到底是什么;-)
  • ummmmm.... 来吧,请立即查看更新的问题。请我期待关注这个概念。
  • @lasseespeholt 我通常会,但正如 uriDium 所说,我怀疑这也是他问题的答案(如最初所述)
【解决方案3】:

假设 strPageMode 代表 ModesEnum 的一个可能值的名称,您可以这样做:

switch (Enum.Parse(typeof(ModesEnum), strPageMode, false))
{
    ... as before
}

【讨论】:

    【解决方案4】:

    枚举字面量(而不是该枚举类型的变量的当前值)常量。

    “通用”一词在 .NET 中具有特定含义,而在英语中具有一般含义。我也不明白这有什么关系。

    根据准匈牙利语名称,我猜测 strPageMode 是一个字符串(请告诉我,您在 C# 代码中并没有真正命名变量)。将 switch 视为一组 if-else 语句的一种语法糖,这意味着您正在对字符串和枚举进行相等比较。如果允许这样做,那将是毫无意义的,因为字符串是字符串,而枚举是枚举,无论它们的值是什么,它们本质上永远不会相等。

    您需要将字符串解析为 ModesEnum 值,并在 switch 语句中使用它,或者使用 ModesEnum.SystemHealth.ToString() 将 case 值设为字符串。

    【讨论】:

    • 是的,先生,我完全同意这种哲学,字符串就是字符串,枚举就是枚举。但是要使通用意味着如果我更改 Enum 值,即我的 ModeEnum items ,那么无论我在哪里使用这个 Enum,都不应该影响我的班级。所以解决方案是比较输入到类或其方法的字符串,检查它是在 Enum 中还是在 Enum 中转换它。就是这样。只是我想将字符串转换为枚举类型,然后我可以检查。但是 VS3.5 不支持有助于执行相同转换的 Enum.TryParse() 方法。那么我必须做什么才能将字符串转换为 Enum 类型?
    • Enum.Parse()。同时,如果您要更改其值,请确保 ModeEnum 不公开可见,因为这将使以后版本的程序集需要在调用程序集之前重新编译它们才能工作(更糟糕的是,这不会很明显,你只会有错误)。添加很好,删除或更改中断运行代码。
    • 谢谢。但不想广告,删除...只需要在枚举中转换字符串。
    【解决方案5】:

    在我的一个项目中,我以类似的方式使用了 switch case。

    switch(UserType)
    {
       case User.Guest:
                break;
    }
    

    这里 UserType 是一个字符串,而 User 是枚举。它对我有用。

    【讨论】:

    • 我认为它不起作用......我的情况它不起作用。你用过什么语言?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多