【问题标题】:Why does HttpSessionState not implement IDictionary?为什么 HttpSessionState 不实现 IDictionary?
【发布时间】:2011-10-07 20:06:33
【问题描述】:

HttpSessionState看起来是一个典型的key->value集合,为什么不实现IDictionary-Interface呢?

背景:我正在尝试在发生错误时输出/保存我的 ASP.NET 网站的上下文,并希望使用递归函数来执行此操作,该函数输出一个集合和所有包含集合。因为HttpSessionState 仅实现ICollectionIEnumerable,所以如果我想以通用方式(= 使用接口)来实现,我会丢失有关键的信息。

【问题讨论】:

    标签: c# .net asp.net session dictionary


    【解决方案1】:

    如何编写自己的 IDictionary 实现包装器,在其构造函数中接收一个 HttpSessionState 对象并按照您的意愿行事?我假设您想这样做,以便您可以换出其他类型的名称-值(IDictionary-implementing)会话实现。

    当然,正如比利所指出的,这是为表现不佳的伪字典穿上字典衣服的好方法!

    【讨论】:

      【解决方案2】:

      IDictionary 表示目标集合能够通过键快速查找。 (据我所知)HttpSessionState 只是一个项目列表,而不是字典样式结构。由于搜索该结构需要线性时间,因此没有理由将其视为字典。如果您需要大量快速查找,请将键和值复制到真正的字典中。如果您不需要快速查找,那么您只需要专门针对该类。

      接口不仅仅是一个方法原型列表。接口也需要保留一些语义。对于任何IDictionary 的(大多数)消费者来说,按键快速查找是一种这样的非明确假设。

      【讨论】:

        【解决方案3】:

        只需遍历Session Keys 和参考值,如下所示:

        Session[key]
        

        【讨论】:

        • 您好,谢谢您的回答。不过,它并没有回答我的问题。那时我仍然无法为输出编写通用函数,它也适用于其他案例/集合。我必须强制转换为 HttpSessionState 才能完成这项工作。
        • 而且它仍然没有解释为什么 .NET 团队在这里选择不使用该接口。我很好奇。 ;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 2021-02-19
        • 2011-03-05
        • 1970-01-01
        • 2020-05-18
        • 2017-02-09
        相关资源
        最近更新 更多