You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中根据枚举类型名称生成含描述的XML的实现方案

通用枚举转XML实现方案

问题背景

枚举定义在NuGet包中无法修改,每个枚举值都带有Description特性,现有单个枚举的XML序列化函数可用,但需要实现传入枚举类型名称即可生成对应XML的通用方法,替代重复的单个枚举处理代码。

示例枚举定义:

public enum FileExtension
{
    [Description("XML extension")]
    xml = 1,
    
    [Description("TXT extension")]
    txt = 2
}

原单个枚举处理函数:

public static string GetFileExtension()
{
    var _cache = System.Enum.GetValues(typeof(FileExtension))
        .Cast<FileExtension>()
        .Select(enumValue => new EnumToXmlSerializer
        {
            Name = enumValue.ToString(),
            Value = (int)enumValue,
            Description = enumValue.GetDescription()
        }).ToList();

    // 此处省略XML序列化逻辑
}

public class EnumToXmlSerializer
{
    public string Name { get; set; }
    public int Value { get; set; }
    public string Description { get; set; }
}

实现方案

核心是通过反射根据枚举类型名称获取Type对象,再统一处理所有枚举值的信息提取和XML序列化。

步骤1:获取枚举Type对象

使用Type.GetType(string typeName),注意传入的类型名称需要包含命名空间;如果枚举在外部程序集(如NuGet包),还需指定程序集名称(格式:命名空间.枚举类型, 程序集名称)。

步骤2:通用枚举信息提取逻辑

把原来的强类型枚举遍历改成反射方式,同时兼容Description特性的获取。

完整代码实现

// 保留原DTO类,可添加XML特性控制节点名称
[System.Xml.Serialization.XmlType("enum")]
public class EnumToXmlSerializer
{
    [System.Xml.Serialization.XmlElement("name")]
    public string Name { get; set; }
    
    [System.Xml.Serialization.XmlElement("value")]
    public int Value { get; set; }
    
    [System.Xml.Serialization.XmlElement("description")]
    public string Description { get; set; }
}

// 通用扩展方法:获取枚举值的Description特性
public static class EnumExtensions
{
    public static string GetDescription(this Enum enumValue)
    {
        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
        var descriptionAttr = fieldInfo?.GetCustomAttributes(typeof(DescriptionAttribute), false)
            .FirstOrDefault() as DescriptionAttribute;
        
        return descriptionAttr?.Description ?? enumValue.ToString();
    }
}

// 通用枚举转XML函数
public string GetXmlFromEnumTypeName(string enumTypeName)
{
    // 1. 验证并获取枚举Type
    var enumType = Type.GetType(enumTypeName);
    if (enumType == null || !enumType.IsEnum)
        throw new ArgumentException($"无效的枚举类型名称:{enumTypeName}");

    // 2. 遍历所有枚举值,转换为DTO列表
    var enumItems = Enum.GetValues(enumType)
        .Cast<Enum>()
        .Select(enumValue => new EnumToXmlSerializer
        {
            Name = enumValue.ToString(),
            Value = Convert.ToInt32(enumValue),
            Description = enumValue.GetDescription()
        })
        .ToList();

    // 3. 序列化DTO列表为目标XML结构
    var xmlSerializer = new System.Xml.Serialization.XmlSerializer(
        typeof(List<EnumToXmlSerializer>), 
        new System.Xml.Serialization.XmlRootAttribute("enums")
    );
    using (var stringWriter = new StringWriter())
    {
        xmlSerializer.Serialize(stringWriter, enumItems);
        return stringWriter.ToString();
    }
}

调用示例

// 传入包含命名空间的枚举类型名称
var xml = GetXmlFromEnumTypeName("YourNamespace.FileExtension");
// 如果枚举在外部NuGet包(假设程序集名为MyEnums.Package)
// var xml = GetXmlFromEnumTypeName("YourNamespace.FileExtension, MyEnums.Package");

生成的XML结构与期望一致:

<enums>
  <enum>
    <name>xml</name>
    <value>1</value>
    <description>XML extension</description>
  </enum>
  <enum>
    <name>txt</name>
    <value>2</value>
    <description>TXT extension</description>
  </enum>
</enums>

内容的提问来源于stack exchange,提问作者deku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:15:40