[英]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.