1

我正在运行一个自定义应用程序,它导入 WSDL 并生成 C# 源代码,使用 WSDLImporter 类来读取合同。

XSD 序列类型被转换为本机数组。为了能够生成自定义集合类型,我可以设置哪些选项?

架构:

<xs:complexType name="getAllSourcesResponse">
    <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" 
            name="return" type="tns:Source"/>
    </xs:sequence>
</xs:complexType>

变成代码:

public partial class getAllSourcesResponse
{
    [System.Xml.Serialization.XmlElementAttribute("return",
        Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public PaymentSource[] @return;

    public getAllSourcesResponse()
    {
    }

    public getAllSourcesResponse(Source[] @return)
    {
        this.@return = @return;
    }
}

我查看了 SvcUtil.exe 代码,它似乎执行以下操作,但它似乎对我的应用程序生成的代码没有任何影响。

WsdlImporter importer = ... 

XsdDataContractImporter contractImporter = 
    new XsdDataContractImporter(codeCompileUnit); 

ImportOptions importOptions = new ImportOptions();
importOptions.ReferencedCollectionTypes.Add(
    typeof(System.Collections.Generic.IList<>)); 

contractImporter.Options = importOptions; 

importer.State.Add(typeof(XsdDataContractImporter), contractImporter); 

@CasperOne,这个模式片段

<xs:complexType name="getClassesForPackageResponse">
     <xs:sequence>
         <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="xs:string"/>
     </xs:sequence>
 </xs:complexType>

生成一个 string[] 类型:

public partial class getClassesForPackageResponse
{
    public string[] @return;
    public getClassesForPackageResponse() {}

    public getClassesForPackageResponse(string[] @return)
    {    this.@return = @return;    }
}

这不会导致字符串集合使用 List:

ImportOptions importOptions = new ImportOptions();
importOptions.ReferencedCollectionTypes.Add(
    typeof(System.Collections.Generic.List<string>));
4

2 回答 2

2

首先,我相信您需要指出一个集合实现,而不仅仅是接口,所以这意味着List<T>代替IList<T>(尽管您当然可以使用接口尝试它)。

其次,需要指定类型参数T:

ImportOptions importOptions = new ImportOptions();

importOptions.ReferencedCollectionTypes.Add(
    typeof(System.Collections.Generic.List<getAllSourcesResponse>));

实际上,您传递的是开放的泛型类型,当导入器尝试解析集合时,它不会与任何内容匹配。

于 2009-02-20T16:36:10.787 回答
1

只是在试图弄清楚如何在 Mono 的 WSDL 导入器中执行此操作时偶然发现了这一点。

在阅读了一些 MSDN 文档并对此进行了一些尝试之后,我使用 .NET 4.5 让它像这样工作:

    var importer = new WsdlImporter (mset);
    var xsdImporter = new XsdDataContractImporter ();
    var options = new ImportOptions ();
    options.ReferencedCollectionTypes.Add (typeof (LinkedList<>));
    xsdImporter.Options = options;
    importer.State.Add (typeof (XsdDataContractImporter), xsdImporter);

您还可以指定特定的通用实例类型,例如List<int>.

这也记录在这里:http: //msdn.microsoft.com/en-us/library/aa702680.aspx

于 2012-10-02T07:20:46.367 回答