Beste Art und Weise der Verwendung von List und Aussetzen Collection
-
10-07-2019 - |
Frage
Ich muss einen Webservice implementieren, die eine Liste von Werten (Integer, benutzerdefinierte Klassen usw.) aussetzen.
Meine Arbeitslösung liefert einen List<T>
und nach FxCop ist es besser, ein Collection<T>
oder ReadOnlyCollection<T>
zurückzukehren.
Wenn ich ein ReadOnlyCollection<T>
zurückzukehren, die Webdienst zeigt einen Fehler wie:
Um XML serialisiert, Typen, die von
ICollection
erben müssen eine Implementierung vonAdd(System.Int32)
auf allen Ebenen ihrer Vererbungshierarchie haben.System.Collections.ObjectModel.ReadOnlyCollection
1
[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
nichtAdd(System.Int32)
implementieren.
Was ist Ihr Lieblings Art und Weise intern eine List<T>
zu verwenden und eine Collection<T>
aussetzen? (Unter Verwendung von C # und vorzugsweise framework 2.0 nur)
Lösung
Liste
Im Hinblick auf die ursprüngliche Frage, können Sie eine Liste wickeln
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
Dies ist eine wahre Wrapper; ein Element in die Hülle (col) hinzuzufügen, und es wird in die Liste aufgenommen. Dies kann etwas verwirrend sein, weil viele solche Konstrukteure das Argument verwenden, um die Anfangspopulation zu tun, aber stellt keine Verbindung zu der ursprünglichen Liste. Collection
Da Sie auf einer Web-Service-Grenze sind, dass die Empfehlung von FxCop keine Anwendung findet. Das ist nützlich (inline mit Eric Lippert jüngsten Blog ) einen Anrufer zu verhindern, über den Speicher der Angerufenen stampfen - aber in einem Web-Service verteilt Szenario, das einfach nicht anwendbar. In der Tat, da Web-Service ein paar gut dokumentierten Probleme mit bestimmten generischen Szenarien hat, ist ein einfaches Array wohl sehr brauchbar und pragmatisch zu einer Webservice-Grenze. Im Zusammenhang mit Blog Eric - in diesem Fall ist es keine Frage des Anrufers / Angerufenen Problem, da zwischen den beiden eine erzwungene Barriere besteht.
Im Hinblick auf der WSDL / mex, vermute ich all 3 (Liste / Sammlung / Array) wird nur ein Block von Elementen worden -. So können Sie mit welcher auch immer eine gut gehen am bequemsten
Andere Tipps
Ich kehre in der Regel IList