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

インターフェイスがなくても、通常のメソッドのように見えるだけなので、問題はReadXmlありWriteXmlません。ただし、これらのメソッドを実際に実装しない限り、コンパイラは「明示的なインターフェイスの実装」を使用できずXmlSchema IXmlSerializable.GetSchema()、明示的なインターフェイスの実装です。

于 2012-07-20T07:02:31.807 に答える