2008-10-13 5 views
8

Ich muss einen Webdienst implementieren, der eine Liste von Werten freigibt (Ganzzahlen, benutzerdefinierte Klassen usw.). Meine Arbeitslösung gibt eine List<T> zurück, und laut FxCop ist es besser, eine Collection<T> oder ReadOnlyCollection<T> zurückzugeben.Die beste Art, die Liste <T> zu verwenden und die Sammlung freizugeben <T>

Wenn ich ein ReadOnlyCollection<T> zurückzukehren, die Webdienst zeigt einen Fehler wie:

XML serialisierbar sein, Typen, die von ICollection erben müssen eine Implementierung von Add(System.Int32) auf allen Ebenen ihrer Vererbungshierarchie haben. System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] implementiert Add(System.Int32) nicht.

Was ist Ihre Lieblingsmethode, intern List<T> zu verwenden und eine Collection<T> freizulegen? (unter Verwendung von C# und vorzugsweise nur Framework 2.0)

Antwort

14

Liste <T> oder Sammlung <T> sind in diesem Fall gut.

In Bezug auf die ursprüngliche Frage, können Sie eine Liste <T> in einer Sammlung <T> sehr einfach wickeln:

List<Foo> list = new List<Foo>(); 
// ... 
Collection<Foo> col = new Collection<Foo>(list); 

Dies ist eine wahre 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 <T> 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 Lippert's recent blog), um zu verhindern, dass ein Anrufer über den Speicher des Angerufenen stampft - aber 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, ich vermute, alle 3 (Liste/Sammlung/Array) wird nur zu einem Block von Elementen - so können Sie gut gehen, was am bequemsten ist.

+0

Vielen Dank für Ihre Antwort und für die Details über die Sammlung als eine echte Wrapper, ich habe nichts darüber vorher gefunden. – alexandrul

1

Normalerweise gebe ich IList <T> von einem WCF-Webdienst zurück: FxCop ist zufrieden damit. Nicht sicher, ob dies mit ASMX-Webdiensten funktioniert.

+0

ASMX-Webdienste werden keine Schnittstellen serialisieren (und eine Laufzeitausnahme geben). –