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;/*您的代码*/}}