【问题标题】:C# How can I get a list of enum string in [EnumMember]?C# 如何在 [EnumMember] 中获取枚举字符串列表?
【发布时间】:2022-08-24 00:31:46
【问题描述】:

我尝试获取 [EnumMember] 中的值列表,但它不起作用。它返回枚举名称列表,而不是 [EnumMember] 中的值。

我举个例子来说明我想要什么:

CarEnum.cs

[JsonConverter(typeof(JsonStringEnumConverter))]
public enum CarEnum
{
    [EnumMember(Value = @\"Rolls Royce\")]
    RollsRoyce=1,

    [EnumMember(Value = @\"Honda\")]
    Honda = 2,

    [EnumMember(Value = @\"Mercedes Benz\")]
    MercedesBenz = 3,
}

这是我尝试获取值的代码:

var carList = Enum.GetValues(typeof(CarEnum)).Cast<CarEnum>()
                            .Select(x => x.ToString())
                            .ToList();

carList 返回[\"RollsRoyce\", \"Honda\", \"MercedesBenz\"] 的列表。

我希望它返回[\"Rolls Royce\", \"Honda\", \"Mercedes Benz\"](值包含品牌名称中的空格)。

如果你能帮助我,请告诉我。

谢谢。

  • enum.ToString() 返回枚举成员的名称,而不是 EnumMember 属性的值。您将需要使用反射来查找与枚举的每个成员关联的 EnumMemberAttribute 的值。
  • 你用谷歌搜索过这个吗? techiedelight.com/convert-enum-to-list-csharp/…
  • @Andrew是的,我有。这些示例使用简单的枚举,我们以字符串或整数形式获取星期日期。他们不像我那样使用 [EnumMember]。
  • 嗨@phuzi 你有任何示例代码来展示你的建议或一些我可以看看的帖子吗?谢谢。

标签: c# enums


【解决方案1】:

感谢@phuzi 在评论中提供参考帖子。

根据帖子,我已将答案修改如下,并且可以正常工作。

public static List<string> GetEnumMemberValues<T>() where T : struct, IConvertible
    {
        List<string> list = new List<string>();
        var members = typeof(T)
             .GetTypeInfo()
             .DeclaredMembers;
        foreach (var member in members)
        {
            var val = member?.GetCustomAttribute<EnumMemberAttribute>(false)?.Value;
            if (!string.IsNullOrEmpty(val))
                list.Add(val);
        }

        return list;
    }

用法:

  1. 将方法放在一个类中。我把它放到 EnumExtension 中。

  2. 像这样调用这个方法:

    var carList = EnumExtension.GetEnumMemberValues();

  3. carList 按预期返回 ["Rolls Royce", "Honda", "Mercedes Benz"]

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2010-12-07
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2021-05-08
    • 2021-04-04
    相关资源
    最近更新 更多