3 回答

TA貢獻1812條經(jīng)驗 獲得超5個贊
解決方法是使用DataContractSerializer進行反射。您甚至不必使用[DataContract]或[DataMember]標記您的類。它將序列化任何對象,無論它是否具有接口類型屬性(包括字典)到xml中。這是一個簡單的擴展方法,它將任何對象序列化為XML,即使它有接口(注意你可以調(diào)整它以便遞歸運行)。
public static XElement ToXML(this object o)
{
Type t = o.GetType();
Type[] extraTypes = t.GetProperties()
.Where(p => p.PropertyType.IsInterface)
.Select(p => p.GetValue(o, null).GetType())
.ToArray();
DataContractSerializer serializer = new DataContractSerializer(t, extraTypes);
StringWriter sw = new StringWriter();
XmlTextWriter xw = new XmlTextWriter(sw);
serializer.WriteObject(xw, o);
return XElement.Parse(sw.ToString());
}
LINQ表達式的作用是枚舉每個屬性,返回作為接口的每個屬性,獲取該屬性的值(底層對象),獲取該具體對象的類型將其放入數(shù)組中,并將其添加到序列化程序中已知類型列表。
現(xiàn)在,序列化器知道它序列化的類型如何,它可以完成它的工作。
- 3 回答
- 0 關注
- 564 瀏覽
添加回答
舉報