gpt4 book ai didi

c# - 在枚举扩展助手中返回枚举列表而不是字符串

转载 作者:行者123 更新时间:2023-11-30 20:29:03 25 4
gpt4 key购买 nike

如何转换 GetWithOrder 方法以按正确顺序返回实际枚举?它适用于枚举的字符串,但我想要实际的枚举值,而且它当然需要是通用的。

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumOrderAttribute : Attribute
{
public int Order { get; set; }
}


public static class EnumExtenstions
{
public static IEnumerable<string> GetWithOrder(this Enum enumVal)
{
return enumVal.GetType().GetWithOrder();
}

public static IEnumerable<string> GetWithOrder(this Type type)
{
if (!type.IsEnum)
{
throw new ArgumentException("Type must be an enum");
}
// caching for result could be useful
return type.GetFields()
.Where(field => field.IsStatic)
.Select(field => new
{
field,
attribute = field.GetCustomAttribute<EnumOrderAttribute>()
})
.Select(fieldInfo => new
{
name = fieldInfo.field.Name,
order = fieldInfo.attribute != null ? fieldInfo.attribute.Order : 0
})
.OrderBy(field => field.order)
.Select(field => field.name);
}
}

public enum TestEnum
{
[EnumOrder(Order=2)]
Second = 1,

[EnumOrder(Order=1)]
First = 4,

[EnumOrder(Order=3)]
Third = 0
}

var names = typeof(TestEnum).GetWithOrder();
var names = TestEnum.First.GetWithOrder();

最佳答案

枚举类型变量的扩展方法没有意义,因为您不需要该变量的值 - 您只需要枚举类型。所以我会选择静态助手类:

public static class Enum<T>
{
public static IEnumerable<T> GetOrderedValues()
{
var type = typeof(T);
if (!type.IsEnum)
throw new InvalidOperationException();

return from f in type.GetFields(BindingFlags.Static | BindingFlags.Public)
orderby f.GetCustomAttribute<EnumOrderAttribute>()?.Order ?? Int32.MaxValue
select (T)f.GetValue(obj: null);
}
}

注意:枚举类型有一个非静态的 value 字段,它实际上保存了枚举的值。所以如果你想列出枚举成员,你只需要使用静态字段。

用法

var values = Enum<Fruits>.GetOrderedValues();

示例枚举

public enum Fruits
{
Banana,
[EnumOrder(2)]
Apple,
[EnumOrder(1)]
Lemon
}

输出将是

[ Lemon, Apple, Banana ]

没有 EnumOrder 属性的成员将排在最后,但如果您使用其他一些默认顺序而不是 Int32.MaxValue,则可以更改该行为。

关于c# - 在枚举扩展助手中返回枚举列表而不是字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com