【问题标题】:Convert an Enum to a List<object>将枚举转换为 List<object>
【发布时间】:2021-04-14 15:45:08
【问题描述】:

首先,为了避免下意识的“这是重复的” 语句:关于序列化枚举有很多关于 SO 的问题。但是没有一个(我发现)处理具有描述的枚举,或者尝试将枚举转换为特定对象的枚举。 (如果你能找到我错过的一个,那么我会接受这是重复的。)

给定一个看起来像这样的枚举:

public enum OptionType
{
    [Description("Option A")]
    OptionA = 1,

    [Description("Option B")]
    OptionB = 2,

    Description("Option C")]
    OptionC= 3,
    }

我想将其转换成如下所示的 JSON 字符串:

[
    { "Id": "1", "Description": "Option A"},
    { "Id": "2", "Description": "Option B"},
    { "Id": "3", "Description": "Option C"}
]

我有这两个类:

public class EnumList
{
    public List<EnumNameValue> EnumNamesValues { get; set; }
}

public class EnumNameValue
{
    public int Id { get; set; }
    public string Description { get; set; }
}

我有一个如下所示的调用方法:

EnumList enumList = EnumSerializer.EnumToJson<OptionType>();

最后(这是我需要帮助的地方):

public static class EnumSerializer
{
    public static EnumList EnumToJson<T>() where T : Enum
    {
        Type enumType = typeof(T);                                 // <--- WORKS!!
        Enum thisEnum1 = (T)Activator.CreateInstance(enumType);    // <--- DOES NOT WORK
        Enum thisEnum2 = (Enum)Activator.CreateInstance(enumType); // <--- DOES NOT WORK

        // If I can get this far, I *THINK* I can figure it out from here
   
    }
}

我已经有一个获取描述的 Enum 扩展,所以我不需要帮助。我遇到的问题是thisEnum1thisEnum2 最终的值都是0

DistrictType 是 Enum 的真实名称。)

如何获得枚举的实际实例,然后可以循环访问?

【问题讨论】:

  • 可以使用Enum.GetValues&lt;T&gt;()获取枚举的值。
  • 如我所见,您需要Enum.GetValues<T>()。然后,可以迭代所有枚举值,收集描述属性,序列化为json。
  • 但是你确实得到了一个枚举实例。 0 只是每个枚举类型的默认值。您实际上也不需要枚举的 instance 来遍历字段。

标签: c# .net enums


【解决方案1】:
public static class EnumSerializer
{
    public static EnumList EnumToJson<T>() where T : struct, Enum
    {
        var type = typeof(T);
        var values = Enum.GetValues<T>()
            .Select(x => new EnumNameValue
            {
                Id = (int)(object)x,
                Description = type.GetField(x.ToString())
                    .GetCustomAttribute<DescriptionAttribute>().Description
            });

        return new EnumList { EnumNamesValues = values.ToList() };
    }
}

Working example

Enum.GetValues 迭代枚举中声明的常量。

当然,您可以将Description 部分替换为您的扩展方法。

【讨论】:

  • 谢谢!你能解释一下为什么需要:where T : struct, Enum
  • Enum.GetValuesstruct 约束,所以 EnumToJson 也需要它。 Enum 约束仅在 C#7.3 中引入,因此它是为了向后兼容。
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2020-08-21
相关资源
最近更新 更多