2008-09-15 14 views
11

CreateChannelメソッドを呼び出すために型が必要なChannelFactoryを使用してWCFをプログラミングしています。例:動的にテンプレート用のジェネリック型を作成する

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

私のケースでは、ルーティングを行っているので、自分のチャネルの工場が使用するタイプがわからない。私はタイプを決定するためにメッセージヘッダを解析することができますが、たとえ私がタイプのインスタンスを持っていても、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#の中に活用することができ、このためのアプローチはありますか?あなたは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); 

だから何をやっていることは、あなたのランタイム駆動タイプを使用したタイプの特殊化を構築し、一般的な「テンプレート」クラスの型定義を取得しているされて探しているものを

+0

[ジェネリッククラスの型パラメータとして渡すアンインスタンス化のSystem.Type]の可能複製(http://stackoverflow.com/questions/266115/pass-an-instantiated-system:それは基本的にこれを行いますタイプのようなタイプのパラメータジェネリッククラスのための) – nawfal

答えて

4

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

ルーティングを行っているので、汎用チャネルシェイプを扱うことができます。あなたは一方向にだけメッセージをルーティングしている場合たとえば、あなたは、このようなメッセージを送信するためにチャネルを作成することができます。

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

あなたは、双方向サービスに送信するために必要な場合は、単に使用します代わりにIRequestChannelを使用します。

ルーティングを行っている場合は、一般的なチャンネルシェイプ(一般的なキャッチオールサービス契約を外部に持っている)を処理するだけではなく、送信しているメッセージすべての適切なヘッダーとプロパティを持っています。

+1

私は私の質問に "答え"をマークジレンマを持っていた。 WCFの使用に関しては、あなたが言及したこのテクニックを使用することができました。それは魅力のように機能します(ありがとう!)。私はそれが技術的に私が尋ねた質問に答えるので(これがよりよい方法であっても)上記を選んだ。 – t3rse

8

この記事をAyendeからご覧ください。WCF, Mocking and 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]); 
関連する問題