我正在尝试创建一个派生自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()
我一定错过了一些非常明显的东西?
答案 0 :(得分:2)
在目前的形式中,您将IXmlSerializable
作为约束应用于T
;不要将其声明为CollectionMetadata<T>
的界面。所以你的显式接口实现是呻吟,因为它找不到接口。
您只需要在约束之前将IXmlSerializable
界面移动到:
public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
where T : BaseMetadata
作为旁注 - 你为此使用了一个明确的接口实现可能是一件非常好的事情,否则这可能是一个真正令人头疼的问题。因为作为公共方法,编译器此时不会呻吟,但如果您尝试将集合作为IXmlSerializable
传递,则会抱怨。
答案 1 :(得分:1)
您说T
实现了IXmlSerializable
接口。据推测,你实际上意味着说ColelctionMetadata<T>
实现它:
public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
where T : BaseMetadata
对于ReadXml
和WriteXml
,它不会出现问题,因为即使没有界面,它们也只是常规方法。但是,除非您确实实现了这些方法,否则编译器不会允许您使用“显式接口实现”,XmlSchema IXmlSerializable.GetSchema()
是一个显式接口实现。