物化集合的最低类型要求是什么?

时间:2014-09-08 15:52:51

标签: c# .net

如果我正在序列化一个对象集合,那么保证集合具体化的最小类型是什么(而不是表达式的结果)?

例如......这不应该是可能的:

var message = new MyMessage {
  Recipients = someCollection.Select... // <- this can't be deserialized without calling ToList()
}

我知道IList会做这项工作,但想知道这是否是最低要求。

2 个答案:

答案 0 :(得分:7)

  

我知道IList会做这个工作

实际上,它不会。没有接口可以有这样的保证,因为我总是可以实现该接口的实现,该接口推迟任何查询的实现,直到调用某些接口方法。现在,通过约定,实现IList的类型将是物化集合,而不是推迟工作的东西,但这不是保证。

要保证您需要使用具体类型而不是接口,接受数组List等。

当然,你有一个选择是接受IEnumerable之类的接口,然后自己将它实现为一个集合(可能作为第三个重载,带有数组和列表的重载避免需要重新实现这些)因为如果你自己实现了它,那么你知道它不会推迟执行。

答案 1 :(得分:2)

您不能。集合是否具体化或查询最终是未通过任何普通公共API公开的实现细节。但是,如果您希望合理地确定常见类型,则可以使用ICollection<T>

ICollection<T>要求Count可用。 IList<T>进一步要求您可以按索引访问元素。由于您似乎不需要IEnumerable<T>以外的任何内容,我建议使用ICollection<T>,例如

public ICollection<Recipient> Recipients { get; set; }

如果确保集合的具体化比创建集合更重要,那么创建IMaterializedIMaterializedEnumerable<T> : IEnumerable<T> marker interface以及实现它的类可能也很有用。能够轻松使用内置类型和方法。