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 von Add(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]] nicht Add(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)

War es hilfreich?

Lösung

Liste oder Collection ist in diesem Fall in Ordnung.

Im Hinblick auf die ursprüngliche Frage, können Sie eine Liste wickeln in einer Collection sehr einfach:

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 ist eine Ausnahme ;-p

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 von einem WCF-Web-Service: FxCop mit diesem glücklich genug ist. Nicht sicher, ob dies mit ASMX Web Service funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top