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()

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

4

2 回答 2

2

在当前的形式中,您将 ;IXmlSerializable作为约束应用到T; 不将其声明为CollectionMetadata<T>. 所以你的显式接口实现在呻吟,因为它找不到接口。

您只需要将IXmlSerializable界面移动到约束之前:

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

作为旁注 - 您为此使用显式接口实现可能是一件非常好的事情,否则这可能会在以后成为一个真正的难题。因为作为公共方法,编译器此时不会抱怨,但如果您尝试将集合传递为IXmlSerializable.

于 2012-07-20T07:02:16.373 回答
1

你说的是T实现了IXmlSerializable接口。据推测,您实际上的意思是说ColelctionMetadata<T>实现了它:

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

因为它ReadXmlWriteXml没有作为一个问题出现,因为即使没有接口,它们也只是看起来像常规方法。但是,编译器不会让您使用“显式接口实现”,除非您确实实现了这些方法,并且XmlSchema IXmlSerializable.GetSchema()是显式接口实现。

于 2012-07-20T07:02:31.807 回答