Мне нравится синтаксис анонимного класса; это - просто меньше кода. Однако один главный довод "против", который я нашел, - то, что Вы не сможете сериализировать тот объект через дистанционную работу. Вы получите исключение о неспособности найти анонимный класс на удаленной стороне.
You'll have to add KnownTypes attribute on the class definition above your class definition for each usage of T. Like this:
[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T>
{
[DataMember]
public IList<T> Items { get; set; }
[DataMember]
public int TotalRows { get; set; }
}
[OperationContract]
PageableResults ListCI();
Alternatively you can define your own collection class, that has a TotalRows property, like this:
[KnownType(typeof(ContentItem))]
[DataContract(Name = "PageableList_Of_{0}")]
public class PageableResults<T> : EntityCollectionWorkaround<T>
{
[DataMember]
public int TotalRows { get; set; }
}
Where EntityCollectionWorkaround is defined here:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html
Я не думаю, что вы сможете это сделать. Как сериализатор узнает, до чего десариализоваться? Многие вещи могут реализовать IList, а интерфейс не имеет конструктора.
Похоже, что это ошибка в WCF, которая исправлена в .NET 4. Однако в этом потоке есть несколько обходных путей:
http://connect.microsoft. com / wcf / feedback / ViewFeedback.aspx? FeedbackID = 433569
Сводка:
- Поместите сборки, содержащие DataContracts, в GAC.
- Установите для параметра LoaderOptimization значение SingleDomain.
Inherit from PageableResults to make a closed generic subclass, in your case PageableContentItem or something like that, and use that as return type. With webservices normally the xml serializer is used and it needs to know everything in advance, that's why you can't return interface types as well.
public class PageableContentItem
: PageableResults<ContentItem>
{
}
[OperationContract]
PageableContentItem ListCI();