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

pet*_*ust 47 c# string enums

我已经将C#枚举定义为

public enum ORDER
{
    ...
    unknown,
    partial01,
    partial12,
    partial23,
}
Run Code Online (Sandbox Code Playgroud)

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

            string ss = ORDER.partial01.ToString();
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在case语句中使用它时,它无法编译:

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

        break;
  ...
Run Code Online (Sandbox Code Playgroud)

我认为枚举是常数.我该如何解决这个问题?

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

Tim*_*imo 95

从C#6开始,您可以使用: case nameof(SomeEnum.SomeValue):

Nameof在编译时进行评估,简单地计算为与给定变量,类型或成员的(非限定)名称匹配的字符串.当然,如果您重命名枚举选项名称,它会一直改变.


sip*_*wiz 44

将交换机中的字符串转换为枚举值.

(ORDER)Enum.Parse(typeof(ORDER), value, true);
Run Code Online (Sandbox Code Playgroud)


Tho*_*rin 30

作为使用的替代方法if .. else,您可以将字符串转换为enum第一个字符串.如果选项数量很少,那可能没什么意义:

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
}
Run Code Online (Sandbox Code Playgroud)

*叹气*如果只有内置T Enum.Parse<T>(string value)和TryParse版本:)

  • ad是一个`Enum.TRyParse <T>(字符串值,输出T结果)`http://msdn.microsoft.com/en-us/library/dd783499.aspx(它是v4.5)所以不可用在撰写本文时) (4认同)

Joe*_*nez 26

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


Sco*_*man 12

你将它设计为枚举是有原因的,但你并没有真正将它用作枚举.为什么要获取枚举值并将其转换为字符串然后在交换机中使用而不是简单地使用枚举?

你说你不能将它解析为枚举因为某些值超出了枚举范围.那时要问的问题是,"为什么?" 如果您允许未定义的值,那么拥有枚举的重点是什么?当你得到一个未定义的值时,你想要发生什么?如果对于任何未定义的值都是相同的,那么您可以使用默认情况.如果不是,那么您可以包含与数字表示匹配的其他案例.

如果你确实得到了字符串,那么你可能不想使用枚举.相反,您需要创建一个包含公共字符串常量的公共静态类,然后您可以在交换机中使用它们.这里的诀窍是评估将以区分大小写的方式完成.

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;
}
Run Code Online (Sandbox Code Playgroud)

(您可能还想清理外壳.)


Dav*_*mer 5

正如Thorarin所指出的,如果您的switch陈述只能包含enum个案,请将您的陈述转换stringenum第一个陈述。至少从.Net framework 4开始,您可以使用此处Enum.TryParse()<TEnum>定义的方法并执行以下操作:

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;
}
Run Code Online (Sandbox Code Playgroud)