2012-10-02 104 views
0

我有一組由XSD.exe由XSD生成的類。我試圖通過從CSV文件中讀取數據來動態填充這些類的一些字段。我遇到的問題是任何代表其他生成類的屬性在創建根對象時都沒有實例化,所以它們都是空的。如何訪問/創建C#xsd自動生成的字段

因此,例如,如果我創建了具有類型爲Sub_Message的屬性「field1」的根文檔Main_Message的實例「doc」,則doc.field1爲null,因此如果嘗試設置doc.field1.name,則I會得到一個例外。

我對如何解決這個問題的第一個想法是爲這些對象屬性進行創建讀取。由於生成的類是部分類,因此我可以爲每個生成的類手動執行此操作,從而修改屬性獲取器。不過,我真的想避免這種做法。有很多生成的類,我不想在XSD更改時維護我的修改版本。

我的下一個想法是在我的代碼中讀取CSV數據的類外部進行創建讀取。我首先要讀取該屬性,如果它爲null,則創建該類的一個實例並將其分配給該屬性,然後在該屬性上設置該字段。但我不知道該怎麼做。我可以使用Activator.CreateInstance(propertyType)創建類的一個實例,但是它返回一個基本的對象引用,如果沒有強制轉換,我不能指定該屬性。然而,我沒有編譯時的類型名稱,所以我不能這樣做。

所以我想弄清楚如何處理這些生成的類從CSV文件中讀取字段值並填充文檔對象上的字段,然後使用它們來創建XML。我目前很難理解如何做到這一點。

回答

0

好了很多搜索後,我找到了一個工作解決方案。

public static T Cast<T>(object o) 
{ 
    return (T)o; 
} 

obj = Activator.CreateInstance(prop.PropertyType); 
MethodInfo castMethod = typeof(MainClass).GetMethod("Cast").MakeGenericMethod(prop.PropertyType); 
prop.SetValue(parent, castMethod.Invoke(null, new object[] { obj }), null); 

所以我能夠在運行時根據需要創建和分配屬性。