新的課程我對XML文件中像這樣如何創建運行時C#
<Student>
<column Type="String">Name</column>
<column Type="Int32">Age</column>
</Student>
我使用VS2008.i不知道runtime.i.e列額外的列可以添加到XML文件。
現在我的問題是如何創建這個類,並在(C#)Generics.i.e列表等存儲此類型(創建類)。
任何幫助,將不勝感激。
新的課程我對XML文件中像這樣如何創建運行時C#
<Student>
<column Type="String">Name</column>
<column Type="Int32">Age</column>
</Student>
我使用VS2008.i不知道runtime.i.e列額外的列可以添加到XML文件。
現在我的問題是如何創建這個類,並在(C#)Generics.i.e列表等存儲此類型(創建類)。
任何幫助,將不勝感激。
這真的很難;如果你絕對想這樣做作爲運行時間類,你必須看看TypeBuilder
等。坦率地說,除非你已經很熟悉,或者這是真的重要的,它可能是不值得的。並非最不重要的:除了object
之外,您不能真正對這些對象進行編碼。
您最好的選擇可能是使用某種DOM(XmlDocument
,XElement
等)來讀取數據,但可能會填入DataTable
。我並不是真正的普通代碼中的DataTable
,但它存在,並很適合這種情況。
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
DataTable table = new DataTable();
foreach(XmlElement child in doc.DocumentElement.SelectNodes("column"))
{
table.Columns.Add(child.InnerText, ParseType(child.GetAttribute("Type")));
}
....
static Type ParseType(string type)
{
switch(type)
{
case "String": return typeof(string);
case "Int32": return typeof(int);
default: throw new NotSupportedException(type ?? "(null)");
}
}
還有'ExpandoObject',雖然它不是一個新類型,而是一個可以具有動態屬性的對象,這可能是所有可能的用例中最重要的。 –
@Jeff,因爲提前未知列,所以即使通過'dynamic',也不會有代碼與'obj.Foo'交談。但是,'ExpandoObject'的*字典*方面可能具有實用性。我沒有提出這個選擇的原因是,那麼你將每個對象的所有密鑰等存儲起來,而不是所有對象都存儲一次,而DataTable(儘管它讓我深感痛苦)會這樣做。 –
首先創建一個名爲Student的類並使其可序列化,然後添加兩個屬性Name和Age。
然後喂XML這個功能
public static Object XMLStringToObject(string xml, Type objectType)
{
object obj = null;
XmlSerializer ser = null;
StringReader stringReader = null;
XmlTextReader xmlReader = null;
try
{
ser = new XmlSerializer(objectType);
stringReader = new StringReader(xml);
xmlReader = new XmlTextReader(stringReader);
obj = ser.Deserialize(xmlReader);
}
catch
{
//Do nothing for now
}
finally
{
xmlReader.Close();
stringReader.Close();
}
return obj;
}
還有更小的序列化功能,但這只是爲了快速顯示ü如何序列年對象,導致通常你會使用XMLStringToObject<T>
泛型主要是關於*編譯時瞭解更多類型信息*。如果你只知道執行時的類型信息,目前還不清楚會有哪些好處。請提供更多關於您要用這些信息*做什麼*的詳細信息。 –
你想完成什麼?如果你有在運行時生成的類,你的應用程序的其餘部分仍然不知道它們,因此不能使用它們。 – Maarten
你真的是指你在運行時不知道列嗎?或者在編譯時? –