簡體   English   中英

動態創建列表C#

[英]Dynamically create List C#

簡而言之:

我有一個列表,其中包含名為Categories的項目。 對於“類別”列表中的每個項目,我都有一個xml文件:

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

創建的項目將序列化為具有所選索引名稱的xml文件。

問題:

問題在於,對於類別中的每個項目,都需要將xml文件反序列化為列表,因為類別的每個對象都必須是另一個列表,因為它也包含項目。

但是不存在用於反序列化xml文件的列表:

反序列化:

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


那么我如何動態創建列表,或者您可以為該問題提供更好的解決方案?

即使每個列表使用不同的名稱,內容的結構也相同。 文字/說明和價值。

我將為Item創建一個類。 就像是

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

然后,我將為每個XML文件具有的ComboItem列表創建另一個類

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的內容。 對每個文件重復此操作。

使用更好的體系結構,可以在基類中創建一些屬性,這些屬性可以是單例的,並且僅加載每個文件一次,從而提高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM