[英]How to create a dynamic list from other lists with C#
我有一個使用XmlSerializer
和StreamReader
讀取的XML文件,如下所示:
CarCollection cars = null;
XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
StreamReader reader = new StreamReader(path)
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();
我的班級CarCollection
正在創建帶有xml文件內容的列表。
這是我的課程:
[Serializable()]
public class Car
{
[XmlElement("StockNumber")]
public string StockNumber { get; set; }
[XmlElement("Make")]
public string Make { get; set; }
[XmlElement("Model")]
public string Model { get; set; }
}
[Serializable()]
public class Address
{
[XmlAttribute("Type")]
public string Type { get; set; }
[XmlElement("Name")]
public string Name { get; set; }
[XmlElement("Street")]
public string Street { get; set; }
[XmlElement("City")]
public string City { get; set; }
[XmlElement("State")]
public string State { get; set; }
[XmlElement("Zip")]
public string Zip { get; set; }
[XmlElement("Country")]
public string Country { get; set; }
}
[Serializable()]
[XmlRoot("CarCollection")]
public class CarCollection
{
[XmlAttribute("PurchaseOrderNumber")]
public string PurchaseOrderNumber { get; set; }
[XmlAttribute("OrderDate")]
public string OrderDate { get; set; }
[XmlElement("DeliveryNotes")]
public string DeliveryNotes { get; set; }
public List<Car> Cars;
[XmlElement("Address")]
public List<Address> Address;
}
XML:
<?xml version="1.0" encoding="utf-8"?>
<CarCollection PurchaseOrderNumber="99503" OrderDate="1999-10-20">
<Address Type="Shipping">
<Name>Ellen Adams</Name>
<Street>123 Maple Street</Street>
<City>Mill Valley</City>
<State>CA</State>
<Zip>10999</Zip>
<Country>USA</Country>
</Address>
<Address Type="Billing">
<Name>Tai Yee</Name>
<Street>8 Oak Avenue</Street>
<City>Old Town</City>
<State>PA</State>
<Zip>95819</Zip>
<Country>USA</Country>
</Address>
<DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
<Cars >
<Car>
<StockNumber>1020</StockNumber>
<Make>Nissan</Make>
<Model>Sentra</Model>
</Car>
<Car>
<StockNumber>1010</StockNumber>
<Make>Toyota</Make>
<Model>Corolla</Model>
</Car>
<Car>
<StockNumber>1111</StockNumber>
<Make>Honda</Make>
<Model>Accord</Model>
</Car>
</Cars>
</CarCollection>
這工作得很好,我正在獲得想要的結果,但是現在我需要將這2個列表和3個字段放在一個動態列表中,我該怎么做?
我想知道你為什么要按照自己的描述去做。
您可以添加如下所示的屬性以獲取所有內容的列表:
[XmlIgnore]
public List<object> Things
{
get
{
var ret = new List<object>();
if (PurchaseOrderNumber != null)
ret.Add(PurchaseOrderNumber);
if (OrderDate != null)
ret.Add(OrderDate);
if (DeliveryNotes != null)
ret.Add(DeliveryNotes);
if(Cars != null)
ret.AddRange(Cars);
if(Address != null)
ret.Add(Address);
return ret;
}
}
但是無法設置它,因為您如何知道字符串是三個字符串屬性中的哪個。 您可以強制將三個屬性放在前三個位置,但這只是令人不快的代碼。 您可能認為您可以這樣做:
[XmlAttribute("PurchaseOrderNumber", typeof(string))]
[XmlAttribute("OrderDate", typeof(string))]
[XmlElement("DeliveryNotes", typeof(string))]
List<object> Things;
但是您不能這樣做,因為序列化器有同樣的問題,它找到一個字符串,它如何知道要在xml中寫入哪個元素或屬性?
您可以做的一件事是,如果Car和Address具有相同的基類,則可以這樣做:
[XmlElement("Car", typeof(Car))]
[XmlElement("Address", typeof(Address))]
public List<BaseClass> Things {get;set;}
告訴我們更多有關您要實現的目標的信息,也許有人會提供更多幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.