如何使用自定义订单属性对枚举进行排序?

Amr*_*rhy 11 c# enums

我有这样的枚举:

enum MyEnum{
 [Order(1)]
 ElementA = 1,
 [Order(0)]
 ElementB = 2,
 [Order(2)]
 ElementC = 3
}
Run Code Online (Sandbox Code Playgroud)

我想列出按我编写的自定义顺序属性排序的元素,以便我得到一个排序的项目列表.

我得到描述属性,但只是这样的一个元素:

FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
Run Code Online (Sandbox Code Playgroud)

它可能是相同的但需要在所有枚举上工作并返回列表或其他排序的枚举.

Dmi*_*try 10

假设OrderAttribute课程如下:

public class OrderAttribute : Attribute
{
    public readonly int Order;

    public OrderAttribute(int order)
    {
        Order = order;
    }
}
Run Code Online (Sandbox Code Playgroud)

获取枚举值的辅助方法:

public static T[] SortEnum<T>()
{
    Type myEnumType = typeof(T);
    var enumValues = Enum.GetValues(myEnumType).Cast<T>().ToArray();
    var enumNames = Enum.GetNames(myEnumType);
    int[] enumPositions = Array.ConvertAll(enumNames, n =>
    {
        OrderAttribute orderAttr = (OrderAttribute)myEnumType.GetField(n)
            .GetCustomAttributes(typeof(OrderAttribute), false)[0];
        return orderAttr.Order;
    });

    Array.Sort(enumPositions, enumValues);

    return enumValues;
}
Run Code Online (Sandbox Code Playgroud)

  • [Display(Order = 0)] 属性也可以使用,只需稍微修改方法即可 (2认同)

Vok*_*erg 6

如果我清楚地了解您的问题,可以采用以下解决方案:

public static class EnumExtenstions
{
    public static IEnumerable<TEnum> EnumGetOrderedValues<TEnum>(this Type enumType)
    {

        var fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
        var orderedValues = new List<Tuple<int, TEnum>>();
        foreach (var field in fields)
        {
            var orderAtt = field.GetCustomAttributes(typeof(EnumOrderAttribute), false).SingleOrDefault() as EnumOrderAttribute;
            if (orderAtt != null)
            {
                orderedValues.Add(new Tuple<int, TEnum>(orderAtt.Order, (TEnum)field.GetValue(null)));
            }
        }

        return orderedValues.OrderBy(x=>x.Item1).Select(x=>x.Item2).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var result = typeof(enumType).EnumGetOrderedValues<enumType>();
Run Code Online (Sandbox Code Playgroud)