1

これが素朴な質問である場合はお詫び申し上げます。私は "ユニバーサル" C# Web サービス クライアントを作成しました。このクライアントは、任意の Web サービスの WSDL を調べて、Web サービスに要求を送信し、応答を表示できる Windows フォーム UI を生成することによって機能します。

次のように UI を生成します。まず、Web サービスの WSDL からコンパイル済みアセンブリを (ServiceDescriptionImporter と CodeCompiler を使用して) 動的に生成し、次に、このプロセスによって生成された SoapHttpClientProtocol クライアントを調べます。

Webサービスのメソッドごとに、パラメータの型を反映して入力パラメータフィールドを表示するUIを生成します。基本的に、それぞれのタイプを認識し、それをどのように表示するのが最適かを決定する必要があります (つまり、文字列パラメーターはテキスト ボックスとして、ブール値はチェックボックスとして、などのように表示されます)。

認識に苦労している型は、ArrayOfKeyValuestringstringKeyValueOfstringstring などの型です。単純に型の名前を解析することもできます (if (名前は "ArrayOf" で始まります) の行に沿って) が、これらの型が何らかの方法で配列であることを認識するためのより良い方法があるはずです。

誰かがこれを行う方法を提案できれば、私は最も感謝しています! ありがとう、マーティン

4

2 に答える 2

1

If it's any type of array or list, it will implement IEnumerable, so this may get you off in the right direction:

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

EDIT: Martin (user304582) points out that some other types like String implement IEnumerable. My assumption here is that, at this point in the code, the simple types (like String, Int32, etc) have already been tested for - and it is not one of them.

One could also use Array instead of IEnumerable, assuming ServiceDescriptionImporter generates parameters using arrays and not lists in all cases.

于 2012-07-20T23:49:33.320 に答える
0

残念ながら、キーと値のタイプをプログラムで抽出する必要があるため、これも機能しません。他の技術的な理由から、クライアントをアップグレードして、.Net 4.0 WsdlImporter と、より明確に型指定されたコードを生成する関連クラスを使用し、副産物としてこれらの ArrayOf クラスの使用を回避しました。ご協力いただきありがとうございます!

于 2012-07-24T03:00:22.597 に答える