2012-04-18 88 views
1

在我的應用程序的一部分中,我使用從xsd方案生成的類型 - 我有2個版本的方案2008和2009 - 我使用的類型是DatumType - 在每種方案中,此類型包含相同屬性 - 它們是確切的,除了命名空間。 有沒有辦法如何將DatumType(2008)轉換爲DatumType(2009),這樣我只能在一種類型的應用程序中工作,而不是兩種?類型轉換爲具有相同屬性的另一個

我正在使用c#和贏取窗體,謝謝!

+0

您可以讓這兩種類型實現與所有這些列的接口。扼殺這個,或者通過另一個類型改變一種類型的所有實例,你可以做的事情並不多。 – Servy 2012-04-18 21:49:56

+0

是的,但這不僅是我需要解決這個問題的發生 - 我有另一種類型的相同的問題,併爲每種類型做接口將是很多工作 – 2012-04-18 21:52:19

+0

是的,這樣做會很多工作。這並不會改變那些確實是您擁有的唯一兩種選擇。 – Servy 2012-04-18 21:53:33

回答

3

不,沒有辦法將一個轉換到另一個,因爲這是兩個不相關的類型,據編譯器知道。

如果目標類型的字段是可賦值的,則可以編寫一個使用反射來複制字段的簡短方法。

您還可以構建將源類型的對象保存爲XML的代碼,並將該XML讀入目標類型的對象中。這稍微更脆弱,因爲它依賴於相同字段的存在,因爲它們以相同的方式轉換爲XML。

+0

當我將這些類型的數據保存到xml中時,只是在讀取xml中更改名稱空間沒有問題 - 只是它們不同 - 所有內容都是相同的 - 但我試圖冒用它 – 2012-04-18 22:04:04

+0

@MartinCh我建議基於XML因爲它可能更容易編碼。基於反射的代碼很可能要快得多,但開發起來要複雜一些。 – dasblinkenlight 2012-04-18 22:06:54

0

在我看來,最簡單的做法是構建一種將一種類型轉換爲另一種類型的小方法(因爲它們都共享屬性),或者如果您有權訪問源代碼,請實現一個接口你可以使用這兩個類作爲該接口。換句話說,如果我們有兩個繼承接口A(包含我們感興趣的所有屬性)的類B和C,那麼我們可以將這兩個類的任何對象作爲一個A進行類型轉換。

+0

我理解接口,但這不是我喜歡使用的方式,我在談論一些linq方法,它會遍歷每個屬性並將其複製到第二種類型的實例中 – 2012-04-18 21:56:39

0

您可以使用簡單的XSLT預處理您的XML文件,以糾正命名空間差異。

Identity的第2部分解釋瞭如何去做。基本上,變換具有匹配元素的模板,併爲每個匹配元素提供輸出。訣竅是擁有一個特定的模板來匹配Datum元素並對其進行轉換,以及一個匹配所有類型元素並且簡單地複製它們的通用轉換。

如果您沒有使用XSLT的經驗,請不要害怕。學習起來比你想象的要容易。您可以使用像XSLT tutorial這樣的教程,這將使您瞭解「身份」的解釋。可以使用XslCompiledTransform Class來應用變換。

你可以use Visual Studio to test and debug your XSLT文件。

相關問題