我无法理解枚举在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次,这似乎是不必要的)?
答案 0 :(得分:7)
只需更改
private static string translateWeekday(int nummer)
到
private static string translateWeekday(Weekdays nummer)
并删除所有演员表。
为什么没有C#打印出值,但是如果我尝试将它们打印出来,每个枚举的名称都会打印出来?
枚举是一种具有特殊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并获取值的字符串表示。