C#将XML ArrayList序列化为List <selectlistitem>

时间:2016-08-18 10:24:40

标签: c# xml deserialization

我有一个如下所示的XML元素:

<myThings>
  <Thing>my first thing</Thing>
  <Thing>my second thing</Thing>
  <Thing>my third thing</Thing>
</myThings>

在ViewModel中我有:

[XmlArray("myThings")]
[XmlArrayItem("This")]
public List<String> MyThings { get;set;}

从XML反序列化时,我最终得到一个字符串列表(MyThings)。

问题是我想要一个“SelectListItem”列表而不是一个简单的字符串列表。

对于列表中的每个selectListItem,我想对TextValue属性使用“Thing”字符串(在XML中提供)。

任何想法都是一种方便的方法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

简短回答是否定的,如果您不拥有该类型,则无法指定如何使用XmlSerializer序列化类型。如果您要序列化SelectListItem,最终会在数组中使用此结构:

<myThings>
    <This>
      <Disabled>false</Disabled>
      <Selected>false</Selected>
      <Text>my first thing</Text>
      <Value>my first thing</Value>
    </This>
</myThings>

但是,您可以指定自己的类型或使用转换,因为其他人也说过。这样,您的类型定义了序列化/反序列化的方式,但您的业务逻辑可以直接使用List<SelectListItem>忽略的类型上的XmlSerializer属性。

public class TypeToSerialize
{
    [XmlArray("myThings")]
    [XmlArrayItem("This")]
    public List<string> myThingsToSerialize { get; set; }

    [XmlIgnore]
    public List<System.Web.Mvc.SelectListItem> MyThings
    {
        get { return this.myThingsToSerialize.Select(x => new SelectListItem {Text = x, Value = x}).ToList(); }
    }
}

您没有提及有关如何维护此列表的任何内容,因此您必须确保通过字符串列表发生突变或添加一些其他方法来帮助解决这个问题,例如void Add(SelectListItem item)将添加到List<string> 1}}(与删除等相同);