如何在 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" 值的名称而不是值。
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());
我无法理解枚举在 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" 值的名称而不是值。
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());