13146413981393992480yibing98@hotmail.com
2009
04
那我们如何枚举Request.Cookies?通过索引,我也不用多说了,大家都知道。
而Syste.Net.CookieCollection不存在这个问题,那HttpCookieCollection与CookieCollection有什么区别呢?我们比较一下它们的基类与接口: HttpCookieCollection 继承了NameObjectCollectionBase,NameObjectCollectionBase实现了ICollection, IEnumerable, ISerializable, IDeserializationCallback接口 CookieCollection实现了ICollection, IEnumerable接口 我想应该在NameObjectCollectionBase中可以找到答案。 首先我们复习一下foreach的工作原理,先看下面的代码:
在编译的时候,C#编辑器会对每一个foreach 区域进行转换,转换成下面的代码:
因为上面的enumerator.Current返回的是System.String类型,所以会出现“指定的转换无效”的错误。 用Reflector查看NameObjectCollectionBase的源代码,可以发 现 HttpCookieCollection.GetEnumerator()调用的是NameObjectCollectionBase中的 GetEnumerator(),而GetEnumerator()返回的是NameObjectCollectionBase内部的一个类 NameObjectKeysEnumerator的实例,这个类实现了IEnumerator。 上面的enumerator.Current实际上是调用的NameObjectKeysEnumerator的Current属性,而 Current属性中又调用了NameObjectCollectionBase的BaseGetKey。头都昏了! 为了找到问题的真正原因,只能继 续。BaseGetKey的代码是这样的:
答案终于找到,NameObjectCollectionBase返回的是NameObjectEntry(这也是NameObjectCollectionBase的一个内部类)的一个成员Key, 这个Key就是string类型的。 问题的原因虽然找到,但为什么要这样设计,暂时还搞不明白,只能等以后慢慢研究。当然,如果有高人解惑就最好了。
Related posts
Comments
Add comment
24小时热线:13146413981 咨询电话:010-80773849 QQ:393992480 MSN:yibing98@hotmail.com Copyright © opbo.net All Rights Reserved. 中华人民共和国电信与信息服务业经营许可证:京ICP备05058619号