2014-05-07 31 views
1

我試圖將更多的DRY原則付諸實踐並陷入知識的侷限性。我寫了一個我正在考慮用於不同對象的反序列化例程。返回不同對象的幫助程序方法

對一個對象來說它工作得很好,但是當我將它移動到一個幫助器中去重用反序列化代碼來處理另一個對象時...當然,它返回了錯誤的類型......但是我怎麼去返回不同的類型...重載(不是非常幹?)...也許返回一個通用的對象,然後鑄造..但那麼我的反序列化工作線將如何工作?

對象1 ABCD

對象2是WXYZ

助手的方法是:

internal static List<ABCD> DeserializeConfig() 
{ 
    .....snip.... 
    XmlSerializer serializer = new XmlSerializer(typeof(List<ABCD>), xRoot); 

    //how would this line above work..pass in the object type like below 

    XmlSerializer serializer = new XmlSerializer(typeof(_passedObject), xRoot);   
} 

謝謝您的幫助

回答

2

只是使通用的方法

internal static List<T> DeserializeConfig<T>() where T : ISerializable 
{ 
    .....snip.... 
    XmlSerializer serializer = new XmlSerializer(typeof(List<T>), xRoot); 

} 

上述假設的自定義序列化,您可以通過執行ISerializable inte控制過程完成的方式,具體方法,字段等rface。這爲您提供編譯器時間檢查。你也可以簡單地使用基本系列化,記得在[NonSerializable]酌情結合[Serializable]屬性來聲明類型 - see docs

+1

我只是在輸入註釋以獲得進一步的解釋......對象ABCD和WXYZ實際上是第三方,因此它們沒有裝飾,所以T檢查條件必須被刪除......但那不是你的錯。你的方式是更徹底更好的做法。 – GPGVM

1

您是否嘗試過使用generics?似乎這將是他們的好地方。

您的方法簽名會更改爲類似 internal static List<T> DeserializeConfig<T>() 其中T是您想要反序列化的對象的類型?

調用它,看起來像 var obj = DeserializeConfig<int>();

+0

謝謝你,包括通話,以及鏈接,所以我可以瞭解泛型。 – GPGVM

1

你應該做一個通用的方法,這樣的事情:

internal static T DeserializeConfig<T>() 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(T), xRoot); 

    // .... 
} 
+0

謝謝@Marius泛型確實是最合適的。 – GPGVM