2012-07-20 59 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()是一个明确的接口实现。