C# 使用泛型继承和接口定义类

C# 使用泛型继承和接口定义类,c#,generics,C#,Generics,我试图创建一个从ObservableCollection派生的类,并将其自身限制为仅与特定基类(BaseMatadata)一起使用。在向集合添加持久性功能时,它还需要实现IXmlSerializable接口 以下是集合的类定义 public class CollectionMetadata<T> : ObservableCollection<T> where T : BaseMetadata, IX

我试图创建一个从ObservableCollection派生的类,并将其自身限制为仅与特定基类(BaseMatadata)一起使用。在向集合添加持久性功能时,它还需要实现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)
    {
    }
}
…我得到以下错误

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

我一定错过了一些非常明显的东西?

在它的当前形式中,您正在应用
IXmlSerializable
作为对
T
的约束;未将其声明为
CollectionMetadata
的接口。因此,显式接口实现正在抱怨,因为它找不到接口

您只需将
IXmlSerializable
接口移动到约束之前:

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
                                     where T : BaseMetadata
公共类集合元数据:ObservableCollection,IXmlSerializable
其中T:BaseMetadata

顺便说一句,使用显式接口实现可能是一件非常好的事情,否则以后可能会让人头疼。因为作为一种公共方法,编译器此时不会抱怨,但如果您试图将集合作为
IXmlSerializable

传递,编译器会抱怨您说
t
实现了
IXmlSerializable
接口。想必,您实际上是想说
collectionmetadata
实现了它:

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
      where T : BaseMetadata
公共类集合元数据:ObservableCollection,IXmlSerializable
其中T:BaseMetadata
对于
ReadXml
WriteXml
来说,这并不是一个问题,因为即使没有接口,它们看起来也像常规方法。但是,编译器不允许您使用“显式接口实现”,除非您确实实现了这些方法,
XmlSchema IXmlSerializable.GetSchema()
是显式接口实现

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