我有以下课程:

[Serializable]
public class SomeModel
{
    [XmlElement("SomeStringElementName")]
    public string SomeString { get; set; }

    [XmlElement("SomeInfoElementName")]
    public int SomeInfo { get; set; }
}

它(当填充了一些测试数据)并使用XmlSerializer进行序列化.Serialize()生成以下XML:

<SomeModel>
  <SomeStringElementName>testData</SomeStringElementName>
  <SomeInfoElementName>5</SomeInfoElementName>
</SomeModel>

我需要的是:

<SomeModel>
  <SomeStringElementName Value="testData" />
  <SomeInfoElementName Value="5" />
</SomeModel>

有没有一种方法可以在不编写自定义序列化代码的情况下将其指定为属性?

推荐答案

您将需要包装器类:

public class SomeIntInfo
{
    [XmlAttribute]
    public int Value { get; set; }
}

public class SomeStringInfo
{
    [XmlAttribute]
    public string Value { get; set; }
}

public class SomeModel
{
    [XmlElement("SomeStringElementName")]
    public SomeStringInfo SomeString { get; set; }

    [XmlElement("SomeInfoElementName")]
    public SomeIntInfo SomeInfo { get; set; }
}

或者,如果您愿意,可以 Select 更通用的方法:

public class SomeInfo<T>
{
    [XmlAttribute]
    public T Value { get; set; }
}

public class SomeModel
{
    [XmlElement("SomeStringElementName")]
    public SomeInfo<string> SomeString { get; set; }

    [XmlElement("SomeInfoElementName")]
    public SomeInfo<int> SomeInfo { get; set; }
}

然后:

class Program
{
    static void Main()
    {
        var model = new SomeModel
        {
            SomeString = new SomeInfo<string> { Value = "testData" },
            SomeInfo = new SomeInfo<int> { Value = 5 }
        };
        var serializer = new XmlSerializer(model.GetType());
        serializer.Serialize(Console.Out, model);
    }
}

将产生:

<?xml version="1.0" encoding="ibm850"?>
<SomeModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <SomeStringElementName Value="testData" />
  <SomeInfoElementName Value="5" />
</SomeModel>

.net相关问答推荐

将Visual Studio更新到v17.9.3后,IDE关闭,dotnet.exe命令报告致命错误.内部CLR错误.(0x80131506)

跨请求共享数据

为什么解码后的字节数组与原始字节数组不同?

类似于字典但没有值的 C# 数据 struct

在 C# 中输入按键

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

JavaScript 中的IsNullOrWhitespace?

如何在 WPF 应用程序中使用 App.config 文件?

ReaderWriterLock 与锁{}

为什么 C# 多维数组不实现 IEnumerable

什么是 project.lock.json?

NuGetPackageImportStamp 有什么用?

将 C# 编译为本机?

如何将时间设置为当天的午夜?

如何根据默认样式创建样式?

如何禁用 Alt + F4 关闭表单?

如何使用 c# 仅获取目录中的文件名?

说明 C# 中 volatile 关键字的用法

了解 C# 中的协变和逆变接口

判断数据表中是否包含空值的最佳方法