动态创建List C#

时间:2013-12-10 16:14:59

标签: c# list dynamic

简而言之:

我有一个名为Categories的项目列表。对于列表类别中的每个项目,我都有一个xml文件:

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

将创建的项目序列化为带有所选索引名称的xml文件。

问题:

问题在于,对于类别中的每个项目,需要将xml文件反序列化为列表,因为类别的每个对象必须是另一个列表,因为它还包含项目。

但是没有用于反序列化xml文件的列表:

反序列化:

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


那么我如何动态创建列表,或者你能为这个问题提供更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

即使每个列表具有不同的名称,内容的结构也是相同的。文字/描述和价值。

我会为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; }
}

我有一个Serialize / Deserialize Helper。像

这样的东西
    #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的内容。对你拥有的每个文件重复一遍。

使用更好的体系结构,您可以在基类中创建一些属性,可以是单例,并且只加载每个文件,只增加一次,从而提高性能。