2011-03-02 59 views
8

我正在使用xml序列化,但現在遇到了一個我從未見過的運行時錯誤。爲什麼XmlSerializer需要從IEnumerable繼承的類型來實現Add(System.Object)?

「要XML序列化,從IEnumerable的 繼承必須在其繼承各級 層次。ImageEditor.EffectOptions 沒有實現添加有 實施加(System.Object的) 類型(系統.Object)「

似乎有點奇怪,被迫通過運行時異常實現一個方法,而不是編譯時間錯誤,如從實現的接口中缺少方法。

這是設計嗎?如果這不是通過像XmlSerializable等某種接口強制執行的?

除此之外,我想知道序列化程序是否保證傳遞正確類型的值,我可以將其轉換爲類型,在我的情況下是EffectOption

或者我應該執行這個Add (object)方法來查看對象是否是EffectOption類型,如果不拋出異常?

我之前沒有實現過這個Add (object)方法,但我猜想把它投到EffectOption並將其添加到EffectOptions集合會更安全。

編輯:這裏的類型本身:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    //IEnumerable methods 
} 

回答

3

因爲子類隱式實現,因爲基類的接口方法,但XmlSerializer的是使用反射,這就是爲什麼你在運行時出現錯誤,而不是編譯時間。

嘗試明確實施並看看會發生什麼。我之前沒有遇到過這個問題,所以我不確定你爲什麼會這樣,除非你正在做一些自定義的事情。

如果你有你的子類顯式實現接口,但沒有做任何實現代碼(讓方法的隱式實現發生),然後從你的子類型聲明中刪除接口,因爲它應該仍然是有效的,因爲你的基類型。 (有人告訴我,如果我在這裏是關)

+0

謝謝,但你是什麼意思的子類?我的類型不是從任何其他類型派生的,它只是實現IEnumerable。 – 2011-03-02 20:08:32

+0

你可以發佈帶有方法存根的類嗎? – 2011-03-02 20:09:46

+0

將代碼添加到問題中。 – 2011-03-02 20:13:40

2

我剛剛碰到這個問題,並通過添加Add方法解決了這個問題:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    public void Add(object o){ 
     this.Options.Add(o as EffectOption); //you may want to extend the code to check that this cast can be made, 
              //and throw an appropriate error (otherwise it'll add null to your list) 
    } 

    //IEnumerable methods 
} 

我希望這有助於。

相關問題