2011-06-03 70 views
6

嗨有可能在C#中創建新類,應用程序從XML中讀取並聲明它們是屬性也從XML中讀取的類。 喜歡:是否有可能在RunTime C上創建新類#

<item id=1> 
<Name>John</Name> 
<Surname>Kennedy</Surname> 
<Age>24</Age> 
</item> 

最好成績。

+0

你的意思實際上是創建一個新的,以前從未見過 - ,*型*,或現有的只是一個新的*實例*類型? – 2011-06-03 08:13:03

+0

如果你正在嘗試用上面的xml創建一個類,那麼它是可悲的不足。例如,年齡的類型是什麼? int,uint,short,byte?或者你想將所有字段存儲爲字符串? – 2011-06-03 12:20:50

+0

看起來您正嘗試創建類型項目('Person')的實例,而不是創建新類型。 – 2011-06-03 12:21:53

回答

9

是的,它是與System.Reflection.Emit命名空間。

但是,在.net 4.0中,您可以使用動態密鑰。像這樣http://blogs.msdn.com/b/mcsuksoldev/archive/2010/02/04/dynamic-xml-reader-with-c-and-net-4-0.aspx

不動,即使你創建新類,則需要反射來訪問它們的屬性

+1

很好的參考。 – 2011-06-03 08:13:21

+0

我還想補充一點,他不需要一個全新的類,而使用XML通常使用LINQ to XML來完成。 – 2011-06-03 08:45:58

0

你可以反序列化這個XML在一個新的類!嘗試這樣的:

public static T DeserializeObject<T>(string filePath) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(filePath); 
     XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement); 
     XmlSerializer ser = new XmlSerializer(typeof(T)); 
     object obj = ser.Deserialize(reader); 

     return (T)obj; 
    } 
+0

他沒有在尋找創建新的對象。我認爲XML文件的結構在編譯時並不知道。他正在要求創建新班級。 – 2011-06-03 08:07:06

+0

+1;我不認爲從最初的問題來看,這個海報是想創建一個新類型,還是僅僅將xml反序列化爲一個現有類型。我認爲後者更可能。 – Polyfun 2011-06-03 10:31:13

+0

@ShellShock我不知道所有XML的一部分只有一些東西,但用戶可以命名的節點無論它想要什麼,讓我們說有4個名字的人!在這種情況下,我不想使用String []或泛型我需要聲明4個字符串,如Name1 Name2 Name3 Name4。 – Burimi 2011-06-03 14:55:40

0

你必須使用反射api做這是一件很複雜的事情。請描述你的情況。也許有更簡單的方法。

0

我真的沒有意義。因爲C#是強類型的,所以你不會在編譯類型上知道對象是什麼樣的,所以你不能使用它。

也許你最好製作一個使用Dictionary作爲節點名稱的對象。然後,您可以查詢字典以查找它具有的屬性。

+0

那麼我的朋友im計劃有我的XML標準和用戶誰想要使用我的應用程序應該構建它的XML,但問題是我不想把一個強的標準,使用戶將知道該怎麼把,但放在哪裏如果我能達到我的問題的目標,價值觀和項目不會成爲問題! @Ray – Burimi 2011-06-03 14:53:27

2

是的。

Here你可以找到如何。

但是,除此之外,您還可以將此結構存儲在Map中,其中鍵和id以及值是存儲屬性的其他映射,其中鍵是名稱,值是值。

相關問題