WCFクライアントクラスは、通常のように設定されているタイプの推論することはできません。C#の制約ジェネリックパラメータは
public class Client : ClientBase<IService>, IService
を私は流暢である拡張メソッドでこれらのクライアントを拡張したいです、しかし、私はいくつかのかなり不格好な呼び出し構文を作成せずに、呼び出し側の元の型を維持するための方法を把握することはできません
using (new Client().WithCookies(...)) {}
:
私のようなusingステートメントを宣言することができるようにnew Client().WithCookies<Client,IService>(...)
私は拡張メソッドの定義に基づいて、なぜコンパイラは、私が渡されたものに基づいてTを推測することはできませんが、それができないかわからない:
public static T WithCookies<T, TChannel>(this T clientBase, IEnumerable<Cookie> cookies)
where T : ClientBase<TChannel>, TChannel
where TChannel : class
{
HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty();
requestProperty.Headers.Add(HttpCookieHeader, string.Join("; ", cookies.Select(c => c.ToCookieString(false))));
new OperationContext(clientBase.InnerChannel).OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
return clientBase;
}
私は彼のブログでエリックリペットを知って、指定の概念を閉じる http://blogs.msdn.com/b/ericlippert/archive/2008/05/19/a-generic-constraint-question.aspx
擬似実装はようなものになるだろう(と一般的に正当な理由のために)「私は、ジェネリックの型引数が何であるかを気にしません」 :
public static T WithCookies<T>(this T clientBase, IEnumerable<Cookie> cookies)
where T : ClientBase<>
{
HttpRequestMessageProperty requestProperty = new HttpRequestMessageProperty();
requestProperty.Headers.Add(HttpCookieHeader, string.Join("; ", cookies.Select(c => c.ToCookieString(false))));
new OperationContext(clientBase.InnerChannel).OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestProperty;
return clientBase;
}
これは私にはうまくいかないようなシナリオの1つですケア TChannelは何ですか - 自分のコードで使用するつもりはありません、私はちょうどClientBaseを使用したいです< >を制約として使用します。
これで、タイプの仕様がなくても私のFluent要件を実装する創造的な方法を考え出すことができますか?
渡された元のアイテムを返さないと、IServiceで実装されているサービスメソッドを呼び出すことができなくなります。
IanGには良い情報がありますここ(仕様に関連):http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/a4847737-4a6b-4fcd-89f2-1b213aaf8422 –