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

How do I properly switch with enums in C#?

我无法理解枚举在 C# 中的工作方式,因为它们打印自己的 "name" 而不是它们所代表的值。例如,我想使用枚举将工作日翻译成另一种语言。这些代表星期几。

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

我下面的方法是有问题的。如果我没有对每个案例进行 (int)-casts,由于类型差异(?),它不会编译。

// 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# 不打印值,而是打印每个枚举的名称(如果我尝试打印它们)?在我的例子中,我应该如何正确地做到这一点(即不必在 switch 中使用 cast 7 次,这似乎是不必要的)?

简单改变

private static string translateWeekday(int nummer)

private static string translateWeekday(Weekdays nummer)

并移除所有演员表。

why doesn't C# print out the values, but the names of each enum if I try to print them out?

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

来自Enum.ToString

and (if) there is a named constant equal to the value of this instance, then the return value is a string containing the name of the constant

您可以使用 .ToString("d") 打印枚举的 "value"。

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

如果你不能't/don不想改变参数类型,你可以提前做转换:

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

您可以使用 DateTimeFormatInfo.CurrentInfo.GetDayName( DateTime.Today.DayOfWeek ) 来获取本地化的(在您的例子中是挪威语)日期名称。所以不需要你的 Weekdays-enum 因为已经有 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
 /// <summary>
  /// An enum class of days
  /// </summary>
  public enum Days
  {
    Sunday= 0,
    Monday= 1,
    Tuesday= 2,
    Wednesday=3,
    Thursday=4,
    Friday= 5,
    Saturday= 6
  }

枚举class

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 并获取该值的字符串表示形式即可。

在这种情况下,我通常使用 System.ComponentModel 命名空间中的 'DescriptionAttribute' 修饰枚举值,提供所需的文本描述,并且我有以下扩展方法 returns 对应枚举值指定的文字:

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());