WCF-Client-Klassen sind in der Regel Setup wie:C# Einschränkung allgemeine Parameter auf einen T <T2> für Fluent Interface/Compiler kann nicht Typen schließen
public class Client : ClientBase<IService>, IService
ich diese Kunden mit einer Erweiterung Methode erweitern möchten, die fließend ist, so dass ich eine using-Anweisung wie erklären kann: Allerdings
using (new Client().WithCookies(...)) {}
, kann ich nicht einen Weg finden, um die ursprüngliche Art des Anrufers zu halten, ohne etwas eher klobig Berufung Syntax zu erstellen:
new Client().WithCookies<Client,IService>(...)
Ich bin mir nicht sicher, warum die Compiler nicht den T ableiten können auf dem, was ich in vergangen habe, aber es kann nicht, basierend auf der Definition der Erweiterungsmethode:
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;
}
ich weiß, Eric Lippert in seinem Blog, entlässt den Begriff ein von der Angabe ‚ist mir egal, was die Art Argument für die generisch ist‘ (und für allgemein gute Gründe) http://blogs.msdn.com/b/ericlippert/archive/2008/05/19/a-generic-constraint-question.aspx
eine psuedo-Implementierung wäre so etwas wie :
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;
}
Dies ist ein Szenario, in dem es um einen guten Sitz zu mir scheint, da ich nicht Sorgfalt tun was TChannel ist - ich bin es nicht in meinem Code verwenden würde, ich jede Client nur verwenden möchten < > als Einschränkung.
Mit diesem gesagt, kann jemand mit einer kreativen Möglichkeit kommen, meine Fluent-Anforderung ohne die Spezifikation der Typen zu implementieren?
Beachten Sie, dass Sie die in IService implementierten Servicemethoden nicht aufrufen können, wenn Sie das übergebene Originalelement nicht zurückgeben.
IanG hat auch einige gute Infos Hier (relativ zur Spezifikation): http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/a4847737-4a6b-4fcd-89f2-1b213aaf8422 –