2013-12-10 285 views
2

一言以蔽之:动态创建列表C#

我有一个名为分类项的列表。对于列表中的每个类别的项目我有一个XML文件:

System.IO.File.Create(Categories[listPicker.SelectedIndex] + ".xml"); 

所建立的项目被序列化到所选择的指数的名称的XML文件。

问题:

的问题是,在类别每个项目的XML文件需要被反序列化到一个列表,因为类别中的各对象必须是另一个列表,因为它也包含的项目。

但不存在的列表为XML文件的反序列​​化:

反序列化:

Serialize.Deserialize(Variable list name , Categories[1]+".xml"); 


那么,如何动态地创建列表,也可以提供更好的解决这个问题?

+0

所以,你要在你的应用程序可用列表,通过在XML文件中保存的数据填充? –

回答

0

即使每个列表中有不同的名称,内容的结构是一样的。文本/说明和值。

我将创造该项目的类。像

public class ComboItem{ 
    public string Value {get; set;} 
    public string Text {get; set;} 
} 

东西然后,我会创建另一个类的ComboItem的列表,每个XML文件将有

public class ComboItemList 
{ 
    public ComboItemList() 
    { 
     ComboItems = new List<ComboItem>(); 
    } 

    [XmlArray("ComboItems"), XmlArrayItem("ComboItem")] 
    public List<ComboItem> ComboItems { get; set; } 
} 

我有一个序列化/反序列化助手。像

#region static T DeserializeObject(string xml, Encoding encoding) 

    /// <summary> 
    /// Deserialize an Xml String to an [object] 
    /// </summary> 
    /// <typeparam name="T">Object Type to Deserialize</typeparam> 
    /// <param name="xml">Xml String to Deserialize</param> 
    /// <param name="encoding">System.Text.Encoding Type</param> 
    /// <returns>Default if Exception, Deserialize object if successful</returns> 
    /// <example> 
    /// // UTF-16 Deserialize 
    /// [object] = SerializationHelper<ObjectType>DeserializeObject(xml, Encoding.Unicode) 
    /// </example> 
    /// <example> 
    /// // UTF-8 Deserialize 
    /// [object] = SerializationHelper<ObjectType>DeserializeObject(xml, Encoding.UTF8) 
    /// </example> 
    public static T DeserializeObject(string xml, Encoding encoding) 
    { 
     if (string.IsNullOrEmpty(xml)) { return default(T); } 
     try 
     { 
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

      using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(xml))) 
      { 
       // No settings need modifying here 
       XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); 

       using (XmlReader xmlReader = XmlReader.Create(memoryStream, xmlReaderSettings)) 
       { 
        return (T)xmlSerializer.Deserialize(xmlReader); 
       } 
      } 
     } 
     catch 
     { 
      return default(T); 
     } 
    } 

    #endregion 

    /// <summary> 
    /// Deserialize an Xml String to an [object] with UTF8 as Encoding 
    /// </summary> 
    /// <param name="xml">Xml String to Deserialize</param> 
    /// <returns>Default if Exception, Deserialize object if successful</returns> 
    /// <example> 
    /// [object] = SerializationHelper<ObjectType>DeserializeObject(xml) 
    /// </example> 
    public static T DeserializeObjectFromFile(string filePath) 
    { 
     if (!File.Exists(filePath)) 
     { 
      throw new FileNotFoundException(string.Format("The file {0}, don't exist.", filePath)); 
     } 
     StreamReader sr = File.OpenText(filePath); 

     string xml = sr.ReadToEnd(); 

     return DeserializeObject(xml, Encoding.UTF8); 
    } 

的东西,我会叫这样

string filePath01 = "PATH TO FILE 01"; 
List<ComboItem> List01 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath01); 

string filePath02 = "PATH TO FILE 02"; 
List<ComboItem> List02 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath02); 

List01和List02将有File01和File02的内容。重复每个文件。

有了一个更好的架构,可以使基类中的某些属性,这可能是单身,并且只会加载每个文件,只有一次,提高了性能。

+1

传奇!非常感谢你,这正是我需要的。这是我的问题的一个非常好的解决方案! – user3087543