15

CreateChannel メソッドを呼び出すために型を期待する ChannelFactory を使用して WCF をプログラミングしています。例えば:

IProxy proxy = ChannelFactory<IProxy>.CreateChannel(...);

私の場合、ルーティングを行っているため、チャネル ファクトリがどのタイプを使用するかわかりません。メッセージ ヘッダーを解析して型を特定することはできますが、Type のインスタンスがあったとしても、ChannelFactory がジェネリック型を期待する場所に渡すことができないため、そこでレンガの壁にぶつかります。

この問題を非常に簡単な言葉で言い換える別の方法は、次のようなことをしようとしているということです。

string listtype = Console.ReadLine(); // say "System.Int32"
Type t = Type.GetType( listtype);
List<t> myIntegers = new List<>(); // does not compile, expects a "type"
List<typeof(t)> myIntegers = new List<typeof(t)>(); // interesting - type must resolve at compile time?

C#内で活用できるこれへのアプローチはありますか?

4

3 に答える 3

33

あなたが探しているのは MakeGenericType です

string elementTypeName = Console.ReadLine();
Type elementType = Type.GetType(elementTypeName);
Type[] types = new Type[] { elementType };

Type listType = typeof(List<>);
Type genericType = listType.MakeGenericType(types);
IProxy  proxy = (IProxy)Activator.CreateInstance(genericType);

つまり、一般的な「テンプレート」クラスの型定義を取得してから、ランタイム駆動型を使用して型の特殊化を構築しています。

于 2008-09-15T22:10:28.023 に答える
8

Ayende からのこの投稿をご覧ください: WCF、Mocking、IoC: Oh MY! . 一番下のどこかに GetCreationDelegate というメソッドがあり、これが役に立ちます。基本的にこれを行います:

string typeName = ...;
Type proxyType = Type.GetType(typeName);

Type type = typeof (ChannelFactory<>).MakeGenericType(proxyType);

object target = Activator.CreateInstance(type);

MethodInfo methodInfo = type.GetMethod("CreateChannel", new Type[] {});

return methodInfo.Invoke(target, new object[0]);
于 2008-09-15T22:59:29.340 に答える
4

ここに質問があります:あなたは本当にあなたの特定のケースで正確な契約タイプでチャンネルを作成する必要がありますか?

ルーティングを行っているので、一般的なチャネル形状を簡単に処理できる可能性が非常に高くなります。たとえば、一方向のみのメッセージをルーティングする場合は、次のようにメッセージを送信するチャネルを作成できます。

ChannelFactory<IOutputChannel> factory = new ChannelFactory<IOutputChannel>(binding, endpoint);
IOutputChannel channel = factory.CreateChannel();
...
channel.SendMessage(myRawMessage);

双方向サービスに送信する必要がある場合は、代わりにIRequestChannelを使用してください。

ルーティングを行っている場合は、一般に、一般的なチャネルシェイプ(外部への一般的なキャッチオールサービスコントラクトを使用)を処理し、送信するメッセージに問題がないことを確認する方がはるかに簡単です。ヘッダーとプロパティ。

于 2008-09-15T22:28:14.983 に答える