Ich muss einen Webservice implementieren, der eine Liste von Werten freigibt (Ganzzahlen, benutzerdefinierte Klassen usw.).
Meine Arbeitslösung gibt List<T>
zurück, und laut FxCop ist es besser, ein Collection<T>
oder ReadOnlyCollection<T>
zurückzugeben.
Wenn ich ein ReadOnlyCollection<T>
zurückgeben möchte, zeigt der Webservice einen Fehler wie:
Damit XML serialisierbar ist, müssen Typen, die von
ICollection
erben, auf allen Ebenen ihrer Vererbungshierarchie eine Implementierung vonAdd(System.Int32)
haben.System.Collections.ObjectModel.ReadOnlyCollection
1
[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
implementiert nichtAdd(System.Int32)
.
Was ist Ihre Lieblingsmethode, um intern List<T>
zu verwenden und Collection<T>
verfügbar zu machen? (unter Verwendung von C # und vorzugsweise nur Framework 2.0)
Liste & lt; T & gt; oder Sammlung & lt; T & gt; sind in diesem Fall in Ordnung.
In Bezug auf die ursprüngliche Frage können Sie eine List & lt; T & gt; in einer Sammlung & lt; T & gt; sehr einfach:
%Vor%Dies ist ein echter Wrapper; Fügen Sie ein Element zum Wrapper (col) hinzu und es wird zur Liste hinzugefügt. Dies kann leicht verwirrend sein, da viele Konstruktoren das Argument für die anfängliche Population verwenden, aber nicht mit der ursprünglichen Liste verknüpfen. Sammlung & lt; T & gt; ist eine Ausnahme ;-p
Da Sie sich auf einer Web-Service-Grenze befinden, gilt diese Empfehlung von FxCop nicht. Das ist nützlich (inline mit Eric Lipperts letzten Blog ) ) um zu verhindern, dass ein Anrufer über den Speicher des Angerufenen stampft - jedoch in einem verteilten Web-Service-Szenario, das einfach nicht zutrifft. In der Tat, da Web-Services einige gut dokumentierte Probleme mit bestimmten generischen Szenarien haben, ist ein einfaches Array wohl sehr nützlich und pragmatisch an einer Web-Service-Grenze. Im Zusammenhang mit Erics Blog - in diesem Fall gibt es keine Frage des Caller / Callee-Problems, da es eine erzwungene Barriere zwischen den beiden gibt.
In Bezug auf WSDL / mex vermute ich, dass alle 3 (Liste / Sammlung / Array) einfach zu einem Block von Elementen werden - also können Sie gut mit dem passenden gehen.
Tags und Links c# generics web-services fxcop