首页 > 解决方案 > 多态 XML 类

问题描述

我有一个控制台应用程序,它调用 3 个不同的 Web 服务操作(基于发送到 exe 的参数)。

每个响应都是一个复杂的数据结构,但非常相似,因此我假设有一种利用多态性的方法,而不是编写 3 个几乎相同的类结构。

例如,响应是 SOAP,因此所有 3 个响应都将具有相同的 Envelope 和 Body 类结构。但是如果 Body 节点中的第一个子节点是 Web 服务的操作(生成相同的对象,但节点名称是唯一的)。

假设这 3 个动作是:action1、action2 和 action3。3 个独特/相似的类结构类似于:

<soap:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns1:action1 xmlns:ns1="[url1]" xmlns:ns2="[url2]" xmlns:ns3="[url3]">
            <AssetName>MyAsset</AssetName>
            <Set>
                <ns2:Instructions attribute1="foo" attribute2="bar">
                    <ns2:childNode1>some</ns2:childNode1>
                    <ns2:childNode2>more</ns2:childNode2>
                    <ns2:childNode3>words</ns2:childNode3>
                    <ns2:MDetail>
                        <ns3:detail1>blah</ns3:detail1>
                        <ns3:detail2>blah</ns3:detail2>
                        <ns3:detail3>blah</ns3:detail3>
                    </ns2:MDetail>
                </ns2:Instructions>
            </Set>
        </ns1:action1>
    </soap:Body>
</soap:Envelope>
<soap:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns1:action2 xmlns:ns1="[url1]" xmlns:ns2="[url2]" xmlns:ns3="[url3]">
            <AssetName>MyAsset</AssetName>
            <Set>
                <ns2:Instructions attribute1="foo" attribute2="bar">
                    <ns2:childNode1>some</ns2:childNode1>
                    <ns2:childNode2>more</ns2:childNode2>
                    <ns2:childNode3>words</ns2:childNode3>
                    <ns2:MDetail>
                        <ns3:detail1>blah</ns3:detail1>
                        <ns3:detail2>blah</ns3:detail2>
                        <ns3:detail3>blah</ns3:detail3>
                    </ns2:MDetail>
                </ns2:Instructions>
            </Set>
        </ns1:action2>
    </soap:Body>
</soap:Envelope>

并且 action3 在 Instructions 节点中有几个不同的属性:

<soap:Envelope xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns1:action3 xmlns:ns1="[url1]" xmlns:ns2="[url2]" xmlns:ns3="[url3]">
            <AssetName>MyAsset</AssetName>
            <Set>
                <ns2:Instructions attribute1="foo" attribute2="bar">
                    <ns2:childNode1>some</ns2:childNode1>
                    <ns2:childNode2>more</ns2:childNode2>
                    <ns2:childNode3>words</ns2:childNode3>
                    <ns2:childNode4>unique words</ns2:childNode4>
                    <ns2:childNode5>specific to action3</ns2:childNode5>
                    <ns2:MDetail>
                        <ns3:detail1>blah</ns3:detail1>
                        <ns3:detail2>blah</ns3:detail2>
                        <ns3:detail3>blah</ns3:detail3>
                    </ns2:MDetail>
                </ns2:Instructions>
            </Set>
        </ns1:action3>
    </soap:Body>
</soap:Envelope>

body 类是第一个可能是唯一的类,因为该类的唯一属性是

[XmlElement(ElementName = "action1", Namespace = "[url1]"]
public action1 Action1 {get;set;}

或者

[XmlElement(ElementName = "action2", Namespace = "[url1]"]
public action2 Action2 {get;set;}

ETC

有没有办法将参数/类型传递给根(信封)类,然后传递给 Body 类和一个构造函数,该构造函数根据我正在处理的操作实例化适当的子类?

标签: c#xmlclasssoappolymorphism

解决方案


推荐阅读