gpt4 book ai didi

c# - 使用 XmlSerializer 反序列化具有额外属性的列表

转载 作者:行者123 更新时间:2023-11-30 12:30:59 26 4
gpt4 key购买 nike

我想反序列化以下 XML...

<MyType>
<Items>
<ItemSum>
<Value>3</Value>
</ItemSum>
<Item>
<Value>1</Value>
</Item>
<Item>
<Value>2</Value>
</Item>
</Items>
</MyType>

...转换为以下结构...

[XmlRoot("MyType")]
public class MyType
{
[XmlArray("Items")]
[XmlArrayItem("Item")]
public CItems Items { get; set; }

public class CItems : List<CItem>
{
[XmlElement("ItemSum")]
public CItem ItemSum { get; set; }
}

public class CItem
{
[XmlElement("Value")]
public int Value { get; set; }
}
}

但是,如果我尝试使用 C# 的 XmlSerializerItemSum 属性始终为 null。知道我做错了什么吗?

最佳答案

这里是:

public class MyType
{
[XmlArray("Items")]
[XmlArrayItem("ItemSum", typeof(ItemSum))]
[XmlArrayItem("Item", typeof(SimpleItem))]
public CItems Items { get; set; }

public class CItems : List<Item> {}

public class ItemSum : Item {}

public class SimpleItem : Item {}

public class Item
{
public int Value { get; set; }
}
}

这样 ItemSum 就是列表的一个元素,您可以通过检查它的类型知道它是哪个。

编辑:您还可以使用计算属性:

public class CItems : List<Item>
{
[XmlIgnore]
public ItemSum ItemSum
{
get { return this.OfType<ItemSum>().Single(); }
}

[XmlIgnore]
public IEnumerable<SimpleItem> SimpleItems
{
get { return this.OfType<SimpleItem>(); }
}
}

关于c# - 使用 XmlSerializer 反序列化具有额外属性的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14897598/

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