2017-10-06 116 views
0

以下代码总是按enum的值排序,但我想按位置排列在enum之间。您注意到Matchupenum中排名第三,但值为6.它总是作为列表中的最后一次出现在迭代中。在枚举中创建枚举列表,并且不包含值

foreach (var enumName in Enum.GetValues(enumType).Cast<TEnum>()) 
      { 

} 

public enum RestrictionDetailType 
    { 
     [EnumMember(Value = "0"), Display(Name = "None")] 
     None = 0, 
     [EnumMember(Value = "1"), Display(Name = "Team")] 
     Team = 1, 
     [EnumMember(Value = "6"), Display(Name = "Matchup")] 
     Matchup = 6, 
     [EnumMember(Value = "2"), Display(Name = "Date/Time")] 
     DateTime = 2, 
     [EnumMember(Value = "3"), Display(Name = "Venue")] 
     VenueCourt = 3, 
     [EnumMember(Value = "4"), Display(Name = "Games")] 
     Games = 4, 
     [EnumMember(Value = "5"), Display(Name = "Exhibition")] 
     Exhibition = 5 
    } 
+1

你可以做任何顺序它们的数组列表,你想和使用相反。 – juharr

+1

或者,在枚举中创建一个新的属性来存储显示顺序和顺序。 –

+2

@DiskJunky - 呃? ['GetValues()'](https://msdn.microsoft.com/en-us/library/system.enum.getvalues(v = vs.110).aspx)被记录为返回它们的顺序“由其无符号的大小“ –

回答

2
foreach(FieldInfo fi in typeof(RestrictionDetailType).GetFields() 
    .Where(fi => fi.IsStatic).OrderBy(fi => fi.MetadataToken)) 
    Console.WriteLine(fi.Name); 

来源:Sort enums in declaration order

+0

这可能有用 - 但我不认为这是有保证的。我认为C#编译器不保证赋予元数据标记的顺序 –

0

你可以写你自己的方法,这样的:

public static List<T> GetEnumValuesInDeclarationOrder<T>() 
{ 
    var t = typeof(T); 
    // first type in this array is the data-type of the enum, int32 if not defined 
    var members = t.GetFields(); 

    var result = new List<T>(members.Length - 1); 
    foreach (FieldInfo mem in members.Skip(1)) 
     result.Add((T)mem.GetValue(null)); 

    return result; 
} 
+1

['GetFields'](https://msdn.microsoft.com/en-us/library/ch9714z3(v = vs.110).aspx ):“GetFields方法不会以特定的顺序返回字段,例如字母顺序或声明顺序。您的代码不得依赖于返回字段的顺序,因为顺序会有所不同。” –

+0

@Damien_The_Unbeliever你说得对。我的错。然后我认为唯一的方法是将另一个自定义属性添加到枚举值并通过此自定义属性值进行排序。 – Michael