有没有办法在实现
ISerializable
接口对象的GetDataObject
方法中知道哪些成员被添加到了SerializationInfo
的实例中?ISerializable
接口对象的GetDataObject
方法中知道哪些成员被添加到了SerializationInfo
的实例中?是的: foreach
foreach(SerializationEntry entry in info) {...}
如果您没有注意到这一点,也可以原谅,因为它并没有实现 IEnumerable
API,但是: foreach
并不要求它必须实现 :)
请参阅 MSDN 了解每个项目提供的内容:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationentry(v=vs.110).aspx
GetEnumerator()
就是 foreach
- 它们本质上是同义词。 - Marc Gravellforeach(var item in obj) { /* your code */ }
基本上 等同于 using(var iter = obj.GetEnumerator()) { while (iter.MoveNext()) { var item = iter.Current; /* your code */ }}
。 - Marc Gravell
IEnumerable
吗?而且为什么它返回一个具体的SerializationInfoEnumerator
而不是一个IEnumerator
?这似乎是一个奇怪的选择... - dcastroList<T>
还返回了自己的自定义迭代器,以实现“如果列表已更改,则抛出异常”的机制。但它仍以接口的形式返回迭代器。但我同意这可能是为了避免装箱 - 我只是注意到SerializationInfoEnumerator
有两个Current
属性,一个明确实现返回一个object
,另一个返回一个SerializationEntry
。 - dcastroList<T>.Enumerator
(请参见http://msdn.microsoft.com/en-us/library/b0yss765(v=vs.110).aspx)。这样做的唯一原因是避免分配,这是值得的,因为`List<T>非常常见。遗憾的是LINQ没有使用它。很想编写一个
List<T>`-LINQ库 :) - Marc GravellList<T>
不是泛型之前的东西……返回一个非自定义的泛型IEnumerator<T>
也不会产生分配,对吗? - dcastro