2013-12-10 178 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