WCF 返回空的自定义集合类型

Posted

技术标签:

【中文标题】WCF 返回空的自定义集合类型【英文标题】:WCF returns empty custom collection type 【发布时间】:2015-07-15 11:33:44 【问题描述】:

如您所知,ObservableCollection 没有 AddRange 扩展方法。所以我们添加了源自ObservableCollection的自定义集合:

[CollectionDataContract]
public class CustomObservableCollection<T> : ObservableCollection<T>

    public CustomObservableCollection()
        : base()
    
    

    public CustomObservableCollection(IEnumerable<T> collection)
        : base(collection)
    
    

    public CustomObservableCollection(List<T> list)
        : base(list)
    
    

    public void AddRange(IEnumerable<T> range)
    
        foreach (var item in range)
        
            Items.Add(item);
        

        this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
        this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
        this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    

    public void Reset(IEnumerable<T> range)
    
        this.Items.Clear();

        AddRange(range);
    

服务引用的默认集合类型为ObservableCollection。这意味着当您添加服务引用时,您会在客户端看到结果为ObservableCollection。我们通过修改Reference.svcmap 文件改变了这一点:

<CollectionMappings>
  <CollectionMapping TypeName="BusinessModel.Common.CustomObservableCollection`1" Category="List" />
</CollectionMappings>

现在我可以看到我的服务正在向客户端返回CustomObservableCollection

但问题是它返回空集合。我知道在服务返回之前自定义集合中有数据,但我的silverlight 客户端收到空集。有没有人知道可能是什么问题?

我们试图添加一个扩展,但问题是扩展方法会为每个元素引发集合更改通知,因此我们的silverlight 应用程序在大型集合上简直是死了。这就是为什么我们使用subclassing 只引发一次事件。

【问题讨论】:

你为什么不为基类库类型ObservableCollection添加一个AddRange扩展方法?对我来说,这似乎更容易。 @Martin,当然我们已经尝试过了,但问题是它会为每个元素引发集合更改通知,因此我们的 silverlight 应用程序在大型集合上简直是死了。这就是为什么我们使用子类化只引发一次事件 好的,现在听起来很合理。 【参考方案1】:

我已经从类中删除了属性[CollectionDataContract],现在一切正常。

【讨论】:

以上是关于WCF 返回空的自定义集合类型的主要内容,如果未能解决你的问题,请参考以下文章

Scala 自定义集合返回 null 列表作为默认值

C#怎么定义泛型集合类型的函数,返回一个集合

哪种列表/集合类型最适合在 WCF 数据协定中使用?

Apex 中的自定义迭代器

为啥我的数据库对象的集合是空的?

从 WCF 服务返回的 XML 中缺少集合项值