【问题标题】:Inheritance and caching in ASP.NETASP.NET 中的继承和缓存
【发布时间】:2011-11-03 05:34:15
【问题描述】:

我有一些类层次结构 - 名为“Group”的基类,其中包含有关单个组的基本信息,以及名为“RootGroup”的类,它继承自“Group”并扩展具有一些属性的基类。组列表使用基类存储在缓存中:例如IEnumerable(有些是普通组,有些是根组。关键是在从缓存中检索集合并转换回IEnumerable类型时,丢失了RootGrop项的特定信息。有什么办法可以防止这种情况除了记住每个缓存项的类型吗?

吉米

【问题讨论】:

    标签: c# asp.net caching


    【解决方案1】:

    您可以在检索每个项目时检查它,并将其转换为正确的类型:

    foreach (object item in list) {
      if (item is RootGroup) {
        Rootgroup rootGroup = item as RootGroup;
        // do stuff  with rootGroup 
      }
    }
    

    如果您使用的是通用集合,例如 List<Group>,您可以像这样更改 foreach:

    foreach (Group item in list)...
    

    【讨论】:

    • as 使用第二个条件来检查 item is RootGroup。考虑直接转换而不是 as,除非您期望显式运算符和继承。
    • imo, as 更好看。如果您担心这样的简单检查,您可能使用了错误的语言。
    【解决方案2】:

    如果我正确理解您的问题,您的RootGroup 属性不会“丢失”。问题是你有一个Group 对象的Group 视图。为了访问RootGroup 属性,您必须将对象转换为RootGroup

    一个简单的检查:

     if(groupItem is RootGroup)
     {
           RootGroup rootGroupItem = groupItem as RootGroup;
           // Do stuff
     } 
    

    【讨论】:

      【解决方案3】:

      另一种方式...

      //from cache
      IEnumerable<Group> groupsFromCache = GetGroupsFromCache();
      IEnumerable<RootGroup> rootGroups = groupsFromCache.OfType<RootGroup>();
      

      http://www.thinqlinq.com/default/Using-Cast-Or-OfType-Methods.aspx

      这有与延迟执行相关的各种细节,但如果没有更多细节,我无法真正判断这是否会有所作为。和其他帖子一样,您与子类相关的信息不会丢失,您只需将其放入可访问的表单中。

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 2013-09-01
        • 2015-07-16
        相关资源
        最近更新 更多