【问题标题】:Create enum list with order of position within enum, not value使用枚举中的位置顺序创建枚举列表,而不是值
【发布时间】:2017-10-06 14:18:32
【问题描述】:

下面的代码总是按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
    }

【问题讨论】:

  • 您可以按照您想要的任何顺序列出它们的数组并使用它来代替。
  • 或者,创建一个新属性来存储显示顺序和枚举中的顺序。
  • @DiskJunky - 嗯? GetValues() 被记录为“按其无符号大小”排序返回它们
  • 枚举的成员按索引排序。这就是枚举知道如何对其值进行排序的方式。如果您想以不同的方式对它们进行排序,那么您要么必须按所需顺序分配索引,要么按所需顺序将值添加到列表或数组中,然后改用该对象。
  • @Damien_The_Unbeliever,我的立场是正确的 - 很高兴知道!

标签: c# .net enums


【解决方案1】:
foreach(FieldInfo fi in typeof(RestrictionDetailType).GetFields()
  .Where(fi => fi.IsStatic).OrderBy(fi => fi.MetadataToken))
    Console.WriteLine(fi.Name);

来源:Sort enums in declaration order

【讨论】:

  • 这可能有效 - 但我认为不能保证。我不认为 C# 编译器保证分配元数据令牌的顺序
【解决方案2】:

您可以编写自己的方法,如下所示:

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;
}

【讨论】:

  • GetFields: "GetFields 方法不会以特定顺序返回字段,例如字母顺序或声明顺序。您的代码不能依赖于返回字段的顺序,因为该顺序会有所不同。”
  • @Damien_The_Unbeliever 你是对的。我的错。然后我认为唯一的方法是向枚举值添加另一个自定义属性并按此自定义属性值对其进行排序。
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
相关资源
最近更新 更多