2013-10-27 70 views
0

如何获得分配的字符串值,我创造了这个枚举从枚举

public enum Days 
    { 
     [Display("Monday")] 
     Mon, 
     [Display("Tuesday")] 
     Tue, 
     [Display("Wednesday")] 
     Wed, 
     [Display("Thursday")] 
     Thu, 
     [Display("Friday")] 
     Fri, 
     [Display("Satrday")] 
     Sat, 
    } 

我想要得到的字符串“星期一”。我试过这样做

Console.WriteLine(Days.mon); 

但是给了我“mon”而不是“Monday”。 有没有办法让字符串星期一?

+1

为什么在枚举本身不使用的全名?或者甚至更好地使用System.DayOfWeek。 –

回答

7

我增强了this answer,为您提供了一个更全面的解决方案,并带有更好的语义语法。

using System; 
using System.ComponentModel; 

public static class EnumExtensions { 

    // This extension method is broken out so you can use a similar pattern with 
    // other MetaData elements in the future. This is your base method for each. 
    public static T GetAttribute<T>(this Enum value) where T : Attribute { 
     var type = value.GetType(); 
     var memberInfo = type.GetMember(value.ToString()); 
     var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false); 
     return (T)attributes[0]; 
    } 

    // This method creates a specific call to the above method, requesting the 
    // Description MetaData attribute. 
    public static string ToName(this Enum value) { 
     var attribute = value.GetAttribute<DescriptionAttribute>(); 
     return attribute == null ? value.ToString() : attribute.Description; 
    } 

} 

此解决方案在Enum上创建了一对扩展方法,以允许您执行所需的操作。我已略微增强了Enum代码,以使用DisplayAttribute类的System.ComponentModel.DataAnnotations的语法。

using System.ComponentModel.DataAnnotations; 

    public enum Days { 
     [Display(Name = "Sunday")] 
     Sun, 
     [Display(Name = "Monday")] 
     Mon, 
     [Display(Name = "Tuesday")] 
     Tue, 
     [Display(Name = "Wednesday")] 
     Wed, 
     [Display(Name = "Thursday")] 
     Thu, 
     [Display(Name = "Friday")] 
     Fri, 
     [Display(Name = "Saturday")] 
     Sat 
    } 

使用上述扩展方法,你现在只需调用以下:

Console.WriteLine(Days.Mon.ToName()); 

var day = Days.Mon; 
Console.WriteLine(day.ToName()); 
+1

切换'ToName'以便利用'var attribute = value.GetAttribute ();'需要将返回值更改为'attribute.Name',所以我至少得到了那么多。我希望看到的是一个返回某种集合(Dictionary,也许是?)的函数,它包含'enum'列表中所有项的键值对。要问的问题太多了? –

+0

这是一个好主意,J.D.我很乐意看到它,如果你拿出一个。 –

2
var type = typeof(Days); 
var memInfo = type.GetMember(Days.Mon.ToString()); 
var attributes = memInfo[0].GetCustomAttributes(typeof(DisplayAttribute), 
    false); 
var description = ((DisplayAttribute)attributes[0]).Description; 

类似this的解决方案。