gpt4 book ai didi

c# - 使用通用方法获取我的枚举属性的 List

转载 作者:太空狗 更新时间:2023-10-29 22:53:07 27 4
gpt4 key购买 nike

一开始,我们有这个基本的枚举。

public enum E_Levels {

[ValueOfEnum("Low level")]
LOW,

[ValueOfEnum("Normal level")]
NORMAL,

[ValueOfEnum("High level")]
HIGH
}

我想得到一个 List<string> 无论是什么枚举。类似于 Extensions.GetValuesOfEnum<E_Levels>()这可能会返回 List<string>有“低电平”、“正常电平”和“高电平”。

StackOF 帮助我获得了一个值属性:

public static class Extensions {

public static string ToValueOfEnum(this Enum value) {

FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
ValueOfEnum[] attribs = fieldInfo.GetCustomAttributes(typeof(ValueOfEnum), false) as ValueOfEnum[];
return attribs.Length > 0 ? attribs[0].value : null;
}
}

无论枚举如何,我都可以调用此方法:E_Levels.LOW.ToValueOfEnum() .

此外,StackOF 帮助我获得了一个 List<string>对于特定 枚举。我在 Controller 中制作了这个方法:

private List<string> GetLevels() {

List<string> levelsToReturn = new List<string>();
var levels = Enum.GetValues(typeof(E_Levels)).Cast<E_Levels>();
foreach(E_Levels l in levels)
levelsToReturn.Add(l.ToValueOfEnum());

return levelsToReturn;
}

但是这种方式需要我为每个枚举重写相同的方法。
所以我尝试将这个通用方法添加到我的类扩展中:

public static class Extensions {

public static string ToValueOfEnum(this Enum value) {...}

public static List<string> GetValuesOf<T>() {

List<string> levelsToReturn = new List<string>();
var levels = Enum.GetValues(typeof(T)).Cast<T>();
foreach(T l in levels)
levelsToReturn.Add(l.ToValueOfEnum());

return levelsToReturn;
}
}

但是在我的 foreach 中,.ToValueOfEnum()是一个未知的方法。

所以我有麻烦了,我希望我能找到一种方法,而不是为每个枚举一次又一次地重写相同的方法......

最佳答案

让我们尽量保持这个更通用的目的。

我有一个 extension method可以从枚举值中获取属性。这将使您能够快速访问属性。

public static class EnumExtensions
{
public static TAttribute GetAttribute<TAttribute>(this Enum value)
where TAttribute : Attribute
{
var type = value.GetType();
var name = Enum.GetName(type, value);
return type.GetField(name)
.GetCustomAttributes(false)
.OfType<TAttribute>()
.SingleOrDefault();
}
}

使用它,您可以创建一些查询以获得您想要的内容。

var valuesOfLevels =
Enum.GetValues(typeof(E_Levels)).Cast<E_Levels>()
.Select(level => level.GetAttribute<ValueOfEnumAttribute>().Value);

因此您的 GetValuesOf() 方法(恕我直言,对于这种特殊方法来说这不是一个好名字)可以这样写:

public static List<string> GetValuesOf<TEnum>()
where TEnum : struct // can't constrain to enums so closest thing
{
return Enum.GetValues(typeof(TEnum)).Cast<Enum>()
.Select(val => val.GetAttribute<ValueOfEnumAttribute>().Value)
.ToList();
}

现在你可以像这样调用这个方法:

var levelValues = GetValueOf<E_Levels>();
// levelValues = { "Low level", "Normal level", "High level" }

关于c# - 使用通用方法获取我的枚举属性的 List<string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022557/

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