C# 获取SerializationInfo中具有值的成员

C# 获取SerializationInfo中具有值的成员,c#,serialization,C#,Serialization,有没有办法知道在ISerializable对象的GetDataObject方法中哪些成员被添加到SerializationInfo的实例中?是:foreach foreach(SerializationEntry entry in info) {...} 请原谅您没有注意到这一点,因为它没有实现和IEnumerableAPI,但是:foreach不要求它这样做:) 请参阅MSDN以了解每项提供的内容:没有显示方法。有一种方法可以用来循环它。但是Marc的foreach建议更好:)有趣!你知道为

有没有办法知道在
ISerializable
对象的
GetDataObject
方法中哪些成员被添加到
SerializationInfo
的实例中?

是:
foreach

foreach(SerializationEntry entry in info) {...}
请原谅您没有注意到这一点,因为它没有实现和
IEnumerable
API,但是:
foreach
不要求它这样做:)


请参阅MSDN以了解每项提供的内容:

没有显示方法。有一种方法可以用来循环它。但是Marc的foreach建议更好:)

有趣!你知道为什么它不实现
IEnumerable
?为什么它返回一个具体的
SerializationInfoEnumerator
,而不是
IEnumerator
?这似乎是一个奇怪的选择。@dcastro如果我不得不猜测的话,缺少IEnumerable是一个疏忽,从来没有得到纠正,因为它是不必要的。选择自定义迭代器并不少见,尤其是在泛型之前的代码中,其目的是通过使用结构表示状态来避免装箱和分配。即使在泛型代码中,这也并不少见:例如,List-of-t有一个自定义迭代器。是的,
List
还返回它自己的自定义迭代器,以实现“列表发生更改时抛出异常”机制。但它仍然返回伪装成接口的迭代器。但我同意这可能是为了避免装箱-我刚刚注意到有两个
当前属性,一个显式实现,返回
对象
,另一个返回
序列化条目
@dcastrono和no;它可以在没有公开可见的自定义迭代器类型的情况下执行“抛出”操作,而且不:它不会将其隐藏在接口后面-它是显式自定义的:一个
列表。枚举器
(请参阅)。这样做的唯一原因是避免分配,这是值得的,因为
List
非常常见。可惜林克没有用它。想要写一个
列表
-LINQ library:)我完全错过了。。。这可能有点离题了,但是:因为
List
并不早于泛型。。。返回一个非定制的、通用的
IEnumerator
不会也避免分配吗?对于最有用的定义,
GetEnumerator()
foreach
-它们本质上是完整上下文的同义词,
foreach(obj中的var项){/*您的代码*/}
基本上是:
使用(var iter=obj.GetEnumerator()){(iter.MoveNext(){var item=iter.Current;/*您的代码*/}}