【问题标题】:How to recognize a C# class as an instance of ArrayOf如何将 C# 类识别为 ArrayOf 的实例
【发布时间】:2012-07-20 05:48:20
【问题描述】:

如果这是一个幼稚的问题,我们深表歉意。我编写了一个“通用”C# Web 服务客户端:它通过检查任何 Web 服务的 WSDL 并生成一个允许您向 Web 服务提交请求并显示响应的 Windows 窗体 UI 来工作。

它生成 UI 的过程如下:首先,它从 Web 服务的 WSDL 中动态生成一个已编译的程序集(使用 ServiceDescriptionImporter 和 CodeCompiler),然后它内省此过程生成的 SoapHttpClientProtocol 客户端。

对于每个 Web 服务方法,显示输入参数字段的 UI 是通过反映参数类型生成的。本质上,我必须识别每种类型并决定如何最好地显示它(因此字符串参数显示为文本框,布尔值显示为复选框,等等)。

我难以识别的类型是 ArrayOfKeyValuestringStringKeyValueOfstringstring 等类型。我可以简单地解析类型的名称(沿着 if(名称以“ArrayOf”开头)),但我确信必须有更好的方法来以某种方式将这些类型识别为数组。

如果有人可以建议如何执行此操作,我将不胜感激!谢谢,马丁

【问题讨论】:

  • 能否提供一些示例内容。说明问题的 SOAP XML 或部分代码。我发现一些 SOAP 文档似乎表明 XML 明确标识了我不知道是否有帮助的数组:w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383522
  • 该类型是否按字面意思称为"ArrayOfKeyValuestringstringKeyValueOfstringstring"?或者它实际上是一个数组?那么换句话说,你想知道一个对象是否真的是一个数组吗?
  • 嗨 - 是的,这个类型就是字面意思。在 Web 服务端,该类型被声明为 Dictionary,但如果我的工具调用 Web 服务,则返回的对象被标识为 ArrayOfKeyValuestringstringKeyValueOfstringstring 类型。如果我测试 type.IsArray,那么这是错误的,但出于我的目的,我想将其视为类似于数组,因此我需要将其标识为“类似数组”。
  • 在服务器端,Web 服务声明如下: Dictionary GetDictionary();如果我查看相应生成的客户端代码,我可以看到: public ArrayOfKeyValueOfstringstringKeyValueOfstringstring[] GetDictionary()

标签: c# arrays reflection types


【解决方案1】:

不幸的是,这也不起作用,因为我需要以编程方式提取键和值的类型。出于其他技术原因,我已升级我的客户端以使用 .Net 4.0 WsdlImporter 及其相关类,这些类生成更清晰的类型代码,并且作为副产品避免使用这些 ArrayOf 类。感谢您的帮助!

【讨论】:

    【解决方案2】:

    如果它是任何类型的数组或列表,它将实现 IEnumerable,所以这可能会让你朝着正确的方向前进:

    if (typeof(IEnumerable).IsAssignableFrom(typeof(ArrayOfKeyValuestringstringKeyValueOfstringstring)))
    {
        // ok, it's an array...
    }
    

    编辑:Martin (user304582) 指出一些其他类型,如 String 实现 IEnumerable。我在这里的假设是,在代码的这一点上,简单类型(如 String、Int32 等)已经过测试——它不是其中之一。

    也可以使用Array 而不是IEnumerable,假设ServiceDescriptionImporter 使用数组而不是所有情况下的列表生成参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多