c# - 如何使用自定义顺序属性对枚举进行排序?

标签 c# enums

我有一个这样的枚举:

enum MyEnum{
 [Order(1)]
 ElementA = 1,
 [Order(0)]
 ElementB = 2,
 [Order(2)]
 ElementC = 3
}

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

我正在获取描述属性,但只是针对这样一个元素:

FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

它可能是相同的东西,但需要处理所有枚举并返回一个列表或另一个排序的枚举。

最佳答案

假设 OrderAttribute 类如下:

public class OrderAttribute : Attribute
{
    public readonly int Order;

    public OrderAttribute(int order)
    {
        Order = order;
    }
}

获取枚举排序值的辅助方法:

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

关于c# - 如何使用自定义顺序属性对枚举进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654151/

相关文章:

c# - 无法将 TwoWay 模式设置为 x :Bind

c# - 十进制数的正则表达式(最多 3 个带逗号的十进制数)

mysql - ALTER TABLE 附加子查询中的 ENUM 值

c++ - 这是 "new auto(enum_type)"的 Microsoft VC++ 2010 编译器错误吗

typescript 运行时错误 : cannot read property of undefined (enum)

c# - 如何使用 Blazor 服务器正确操作 EditContext 中的验证消息

c# - EF Linq 中的 HAVING 子句

c# - 获取枚举实例的名称

c# - XAML - 逗号分隔的依赖属性

c# - 从 Swagger 中排除特定的枚举值