如何在case语句中使用C#enum值的字符串值?

如何在case语句中使用C#enum值的字符串值?,c#,string,enums,C#,String,Enums,我将C#enum定义为 并且可以将其值用作字符串,如中所示: string ss = ORDER.partial01.ToString(); 但是,当我尝试在case语句中使用它时,它无法编译: string value = ... switch (value) { case null: break; case "s": // OK break; case ORDER.partial01.ToStr

我将C#enum定义为

并且可以将其值用作字符串,如中所示:

            string ss = ORDER.partial01.ToString();
但是,当我尝试在case语句中使用它时,它无法编译:

string value = ...
switch (value)
{
    case null:
        break;
    case "s":
        // OK
        break;
    case ORDER.partial01.ToString():
        // compiler throws "a constant value is expected"

        break;
  ...
我以为枚举是常量。我该怎么做


(我无法将值解析为枚举,因为某些值超出范围)

枚举是常量,但.ToString()的结果不是常量。就编译器而言,它是一个动态值。您可能需要将开关大小写转换为一系列if/else语句

将开关中的字符串转换为枚举值

(ORDER)Enum.Parse(typeof(ORDER), value, true);

枚举值是常量,但您尝试使用的是方法(ORDER.partial01.ToString())的结果,而不是常量

在我看来,最好的选择是将其转换为使用if/else if/else语句,而不是使用开关。这将允许您使用所需的逻辑


或者,如果将字符串切换为枚举值,则可以直接打开枚举值。但是,您不能在一个开关中打开enum+null+其他字符串。

您不能只说

case "partial01":

枚举是常量,但ToString()是返回值的函数。基于调用它的枚举对象的实例

这是两种说法:

ORDER.partial01.ToString()
ORDER.partial02.ToString()

调用同一个函数,但返回两个不同的值,因此对函数的调用。ToString()本身不是一个常量值。

就编译器而言,这不是一个静态值,因为它是一个函数调用:

ORDER.partial01.ToString()
因此,不能将其用作case语句中的比较。但是,您可以简单地执行以下操作:

case "partial01"

这是可行的,因为枚举值和字符串是相同的。

作为使用
if。。否则,您可以先将字符串转换为枚举。但是,如果选择的数量很少,这可能没有多大意义:

if (Enum.IsDefined(typeof(ORDER), value))
{
    switch ((ORDER)Enum.Parse(typeof(ORDER), value)
    {
        case ORDER.partial01:
            // ... 
            break;
        case ORDER.partial12:
            // etc
    }
}
else
{
    // Handle values not in enum here if needed
}

*叹气*如果有一个内置的
T Enum.Parse(字符串值)
,和一个TryParse版本:)

您将其设计为枚举是有原因的,但实际上并没有将其用作枚举。为什么要获取枚举值并将其转换为字符串,然后在交换机中使用,而不是简单地使用枚举

您说过无法将其解析为枚举,因为某些值超出了枚举范围。然后要问的问题是,“为什么?”如果允许未定义的值,那么使用枚举有什么意义?当您得到一个未定义的值时,您希望发生什么?如果任何未定义值的情况相同,则可以使用默认情况。如果不是,则可以包含与数字表示形式匹配的其他案例

如果您真的得到了字符串,那么您可能不想使用枚举。相反,您希望创建一个包含公共字符串常量的公共静态类,然后可以在交换机中使用它。这里的技巧是,评估将以区分大小写的方式进行

public static class Order
{
   public const string Unknown = "Unknown";
   public const string Partial01 = "Partial01";
   public const string Partial12 = "Partial12";
   public const string Partial23 = "Partial23";
}

string value = Order.Partial01
switch (value)
{
   case Order.Partial01:
      break;

    default:
       // Code you might want to run in case you are
       // given a value that doesn't match.
       break;
}

(您可能还需要清理外壳。)

如Thorarin所述,如果您的
开关
语句只能包含
枚举
大小写,请先将
字符串
转换为
枚举
。至少在.Net framework 4中,您可以使用定义的
Enum.TryParse()
方法并执行以下操作:

ORDER orderEnum = ORDER.unknown;
Enum.TryParse<ORDER>(value, out orderEnum);

switch (orderEnum)
{
    case ORDER.unknown:
        // perhaps do something to deal with cases not matching
        // to known enum values, based on the string value
        break;
    case ORDER.partial01:
    case ORDER.partial12:
    case ORDER.partial23:
        // map value to known cases, etc.
        break;
}
ORDER orderEnum=ORDER.unknown;
TryParse(值,out-orderEnum);
开关(orderEnum)
{
案件顺序。未知:
//也许做点什么来处理不匹配的案例
//到已知枚举值,基于字符串值
打破
案例顺序。第1部分:
案例顺序。第12部分:
案件顺序。第23部分:
//将价值映射到已知案例等。
打破
}
自C#6以来,您可以使用:
case nameof(SomeEnum.SomeValue):


Nameof是在编译时计算的,只是一个与给定变量、类型或成员的(非限定)名称相匹配的字符串。当然,如果您重命名枚举选项名称,它会随之更改。

只需定义一个全局变量即可

static ORDER orderstr;
现在,您可以在页面的任何位置设置
orderstr
的值

public enum ORDER
{ 
    unknown,
    partial01,
    partial12,
    partial23,
}

switch (orderstr)
{
    case Order.Partial01:
        break;
    default:
        break;
}

使用扩展名

      public static string ToGender(this Gender enumValue)
        {
            switch (enumValue)
            {
                case Gender.Female:
                    return "Female";
                case Gender.Male:
                    return "Male";
                default:
                    return null;
            }
        }
示例

Gender.Male.ToGender();

这不会处理null比较,但可以在case语句外部处理边缘大小写。string value=null//“partial01”;点菜?顺序=值==空?null:(ORDER?)Enum.Parse(typeof(ORDER),value,true);如果使用ORDER?…可以打开null。。。但不是字符串。有时只检查枚举值,有时涉及更大范围的值。我同意这可能是一个混乱的设计,它可能会在以后消失。@peter.murray.rust:你实际上得到了什么样的价值?您总是以字符串形式获取值,还是以数字形式获取值?如果是数字,请保留枚举,将该值作为枚举打开,并使用默认大小写或其他与“额外”值匹配的标记大小写来执行相应的工作。如果是字符串,那么使用我展示的方法,使用一个静态类来保存字符串表示。您仍然可以添加与“额外”值匹配的其他标记案例。归根结底,只有当你想给数值起一个“友好”或有意义的名字时,枚举才是真正有用的。这可能会很快变得很难看。ad是一个
Enum.TRyParse(字符串值,out T结果)
(它是v4.5),所以在编写本文时不可用)开关((ORDER)Enum.Parse(typeof(ORDER),value)没有结束”)“非常好。我想在编译时使用enum的字符串值(在属性中),这为我解决了这个问题。谢谢!!干净,干净,谢谢!
Gender.Male.ToGender();