0

Web サービス リクエストから次の XML が送られてきます。

<Resource>
    <Create>
       <Name />
       <Reference />
       ...
    </Create>
</Resource>

ただし、次のこともできます。

<Resource>
    <Delete>
       <Name />
       <Reference />
       ...
    </Delete>
</Resource>

次のように、操作と呼ばれる基本クラスがあります。

[XmlInclude(typeof(Create))]
[XmlInclude(typeof(Delete))]
public abstract class Operation
{
    protected string Name {get; set;}
    protected string Reference {get; set;}
    ...
}

Create と Delete の両方のクラスが継承しResource、プロパティを含むクラスが呼び出されOperationます。

public class Resource
{
    public Operation {get; set;}
}

XML をクラスの正しい具象実装にデシリアライズしたいと思いますOperation

私が試してみました

using (var reader = XmlReader.Create(new StringReader(xmlData)))
{
    return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
}

whereTはタイプですResourceが、役に立ちません (Operationプロパティは alwaysnullです)。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

1

操作をリストとして設計するとうまくいくかもしれません。クラスのユーザーに対して常に 1 つの操作しか存在しないようにする必要がある場合は、このリスト プロパティを通常のユーザーに対して非表示にし、[XmlIgnore] を設定して操作プロパティを公開します。

おそらく、XmlElement は XmlArrayItem よりもニーズに適しています。

public class Resource
{
    [XmlArrayItem("Create", typeof(Create))]
    [XmlArrayItem("Delete", typeof(Delete))]    
    public List<Operation> {get; set;}
}
于 2013-09-23T14:22:45.510 に答える