C# 什么';物化集合的最低类型要求是什么?

C# 什么';物化集合的最低类型要求是什么?,c#,.net,C#,.net,如果我序列化一个对象集合,那么保证集合被物化(而不是表达式的结果)的最小类型是什么 e、 g..这不可能: var message = new MyMessage { Recipients = someCollection.Select... // <- this can't be deserialized without calling ToList() } var message=new MyMessage{ Recipients=someCollection。选择…// 我知道

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

e、 g..这不可能:

var message = new MyMessage {
  Recipients = someCollection.Select... // <- this can't be deserialized without calling ToList()
}
var message=new MyMessage{
Recipients=someCollection。选择…//
我知道它会做这项工作

实际上,它不会。任何接口都不可能有这样的保证,因为我总是可以实现该接口,将任何查询的物化延迟到调用某些接口方法为止。现在,按照惯例,实现
IList
的类型将是物化的集合,而不是去物化的集合运送工作,但这不是保证

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


当然,您可以选择接受一个接口,例如
IEnumerable
,然后自己将其具体化为一个集合(可能作为第三个重载,对数组和列表进行重载,以避免需要重新具体化它们)因为如果您自己实现了它,那么您知道它不会推迟执行。

您不能。无论集合是物化的还是查询最终都是一个实现细节,不会通过任何普通的公共API公开。但是,如果您想合理地确定给定的公共类型,您可以使用
ICollection

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

public ICollection<Recipient> Recipients { get; set; }
公共ICollection收件人{get;set;}

您还可以创建
imamaterialized
imamaterializedEnumerable:IEnumerable
和类实现它,如果确保集合被物化比能够轻松使用内置类型和方法更重要。

什么类型是
someCollection
?通常最小值是
IEnumerable
@ErikPhilips
IEnumerable
,允许延迟加载/执行,所以不是这样。从技术上讲,这是不可能的如果是返回类型,我应该问集合是什么。
AsEnumerable
将返回延迟加载的集合,
ToList()
将返回显式加载的列表,但这取决于EF与Linq2Sql与Linq2Entities。它们并不完全相同。