2012-07-20 76 views
2

我想創建一個派生自ObservableCollection的類並將其自身限制爲僅與特定的基類(BaseMetadata)一起使用。它還需要實現IXmlSerializable接口,因爲我正在爲集合添加持久性功能。定義具有泛型繼承和接口的類

這裏是集合的類定義...

public class CollectionMetadata<T> : ObservableCollection<T> where T : BaseMetadata, 
            IXmlSerializable 
{ 
    XmlSchema IXmlSerializable.GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
    } 
} 

...的BaseMetadata可以簡單求到一個空的類,仍然產生錯誤......

public class BaseMetadata 
{ 
} 

。 ..我得到以下錯誤....

CollectionMetadata<T>.IXmlSerializable.GetSchema()': 
    containing type does not implementinterface 
    'System.Xml.Serialization.IXmlSerializable' 

...從以上代碼的以下行...

XmlSchema IXmlSerializable.GetSchema() 

我必須缺少一些真正明顯的東西嗎?

回答

2

在它的當前形式中,您將IXmlSerializable作爲約束應用於T;不會將其聲明爲CollectionMetadata<T>的界面。所以你明確的接口實現是呻吟,因爲它找不到接口。

你只需要移動IXmlSerializable接口前的約束:

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable 
            where T : BaseMetadata 

作爲一個側面說明 - 這可能是你使用這樣的一個顯式接口實現一個真正的好東西,否則這會後來一直是一個真正的頭腦搔癢。因爲作爲一種公共方法,編譯器現在不會呻吟,但如果您試圖將集合傳遞給IXmlSerializable,則會抱怨。

1

您的意思是T實現了IXmlSerializable接口。據推測,你實際上的意思是說ColelctionMetadata<T>實現它:

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable 
     where T : BaseMetadata 

對於ReadXmlWriteXml它不存在問題,因爲即使沒有界面,他們只是看起來像普通的方法。但是,編譯器不會讓你使用「明確的接口實現」,除非你真的實現了這些方法,並且XmlSchema IXmlSerializable.GetSchema()是一個明確的接口實現。