如何在C#中使用枚举正确切换?

时间:2015-03-12 15:37:27

标签: c# enums switch-statement

我无法理解枚举在C#中的工作原理,因为它们会打印自己的“名称”而不是它们所代表的值。作为一个例子,我想使用枚举将工作日翻译成另一种语言。这些代表星期几。

enum Weekdays { Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun };

我的以下方法是问题所在。如果我没有对每个案例进行(int)-cast,则由于类型差异(?)而无法编译。

// Returns weekday in Norwegian.
private static string translateWeekday(int nummer)
{
    switch (nummer)
    {
        case (int)Weekdays.Mon:
            return "Mandag";
        /* ...... */
        case (int)Weekdays.Sun:
            return "Søndag";
    }
    return "Invalid input.";
}

我用这个来测试我的程序。我也要投这一个。

static void Main(string[] args)
{
    var ukedag = translateWeekday((int)Weekdays.Tue);
    Console.WriteLine(ukedag);
}

我现在的实际问题是为什么我需要这些演员表以及为什么C#不打印出值,但是如果我尝试将它们打印出来,每个枚举的名称?在我的例子中,我应该如何正确地做到这一点(即不必在开关中使用强制转换7次,这似乎是不必要的)?

5 个答案:

答案 0 :(得分:7)

只需更改

private static string translateWeekday(int nummer)

private static string translateWeekday(Weekdays nummer)

并删除所有演员表。

  

为什么没有C#打印出值,但是如果我尝试将它们打印出来,每个枚举的名称都会打印出来?

枚举是一种具有特殊ToString的类型,默认情况下,"打印"值的名称而不是值。

来自Enum.ToString

  

和(if)有一个等于此实例值的命名常量,则返回值是一个包含常量名称的字符串

您可以使用.ToString("d")打印"值"一个枚举。

string str1 = Weekdays.Mon.ToString(); // Mon
string str2 = Weekdays.Mon.ToString("d"); // 1

答案 1 :(得分:4)

您可以使用DateTimeFormatInfo.CurrentInfo.GetDayName( DateTime.Today.DayOfWeek )获取本地化(在您的情况下为挪威语)日期名称。所以不需要Weekdays - 枚举,因为已经有DayOfWeek-enum

您甚至可以明确指定要使用的文化:

var norwegianCulture = new CultureInfo("nn-NO");
string dayName = norwegianCulture.DateTimeFormat.GetDayName(DateTime.Today.DayOfWeek); // torsdag
dayName = norwegianCulture.DateTimeFormat.GetDayName(DayOfWeek.Monday); //måndag

答案 2 :(得分:3)

如果您无法更改参数类型,可以提前进行演员投放:

switch ((Weekdays)nummer)
{
    case Weekdays.Mon:
        return "Mandag";
    /* ...... */
    case Weekdays.Sun:
        return "Søndag";
}

答案 3 :(得分:1)

在这种情况下,通常使用' DescriptionAttribute'来装饰枚举值。在System.ComponentModel命名空间中找到,提供所需的文本描述,我有以下扩展方法,返回为相应的枚举值指定的文本:

public static string Description(this Enum value)
{
    FieldInfo field = value.GetType().GetField(value.ToString());
    DescriptionAttribute descriptionAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) 
                                                as DescriptionAttribute;

    if (descriptionAttribute == null || string.IsNullOrEmpty(descriptionAttribute.Description))
    {
        return value.ToString();
    }

    return descriptionAttribute.Description;
}

因此,在您的情况下,您可以将枚举定义为:

enum Weekdays
    {
        [Description("Mandag")]
        Mon = 1,
        [Description("Søndag")]
        Sun, 
    }

然后写

 Weekdays today = Weekdays.Mon;
 Console.WriteLine(today.Description());

答案 4 :(得分:0)

 /// <summary>
  /// An enum class of days
  /// </summary>
  public enum Days
  {
    Sunday= 0,
    Monday= 1,
    Tuesday= 2,
    Wednesday=3,
    Thursday=4,
    Friday= 5,
    Saturday= 6
  }

枚举类

switch (type)
      {
        case 0:
          return Days.Sunday.ToString();
        case 1:
          return Days.Monday.ToString();
        case 2:
          return Days.Tuesday.ToString();
        case 3:
          return Days.Wednesday.ToString();
        case 4:
          return Days.Thursday.ToString();
        case 5:
          return Days.Friday.ToString();
        case 6:
          return Days.Saturday.ToString();
        default:
          return string.Empty;
       }

还有一种方法可以在枚举值之上使用描述符,因此您只需调用.Description并获取值的字符串表示。