2012-07-03 72 views
1

新的課程我對XML文件中像這樣如何創建運行時C#

<Student> 
    <column Type="String">Name</column> 
    <column Type="Int32">Age</column> 
</Student> 

我使用VS2008.i不知道runtime.i.e列額外的列可以添加到XML文件。

現在我的問題是如何創建這個類,並在(C#)Generics.i.e列表等存儲此類型(創建類)。

任何幫助,將不勝感激。

+0

泛型主要是關於*編譯時瞭解更多類型信息*。如果你只知道執行時的類型信息,目前還不清楚會有哪些好處。請提供更多關於您要用這些信息*做什麼*的詳細信息。 –

+2

你想完成什麼?如果你有在運行時生成的類,你的應用程序的其餘部分仍然不知道它們,因此不能使用它們。 – Maarten

+0

你真的是指你在運行時不知道列嗎?或者在編譯時? –

回答

1

這真的很難;如果你絕對想這樣做作爲運行時間類,你必須看看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)"); 
    } 
} 
+1

還有'ExpandoObject',雖然它不是一個新類型,而是一個可以具有動態屬性的對象,這可能是所有可能的用例中最重要的。 –

+1

@Jeff,因爲提前未知列,所以即使通過'dynamic',也不會有代碼與'obj.Foo'交談。但是,'ExpandoObject'的*字典*方面可能具有實用性。我沒有提出這個選擇的原因是,那麼你將每個對象的所有密鑰等存儲起來,而不是所有對象都存儲一次,而DataTable(儘管它讓我深感痛苦)會這樣做。 –

-1

首先創建一個名爲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>