Die beste Methode, um ListT zu verwenden und CollectionT verfügbar zu machen

8

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 von Add(System.Int32) haben.    System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] implementiert nicht Add(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)

    
alexandrul 13.10.2008, 13:01
quelle

2 Antworten

14

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.

    
Marc Gravell 13.10.2008, 13:05
quelle
1

Ich gebe normalerweise IList & lt; T & gt; von einem WCF-Webservice: FxCop ist damit zufrieden. Nicht sicher, ob dies mit ASMX-Webdiensten funktioniert.

    
Joe 13.10.2008 14:06
quelle

Tags und Links