代码之家  ›  专栏  ›  技术社区  ›  Chris Stavropoulos

如何反序列化Enumerable.ToList<>()to List<>

  •  5
  • Chris Stavropoulos  · 技术社区  · 15 年前

    我正在尝试建立一个类似这样的对象:

      public class MyObject
      {
        private IList<AnotherObject> items;
        public List<AnotherObject> Items
        {
          return items.AsEnumerable().ToList<AnotherObject>();
        }
      }
    

    我使用NHibernate作为我的DAL,并让它直接映射到items字段,所有这些都可以正常工作。

    我也在使用Windows工作流,复制器活动不适用于通用的IList。( http://social.msdn.microsoft.com/Forums/en-US/windowsworkflowfoundation/thread/2ca74b60-fd33-4031-be4b-17a79e9afe63 )这基本上迫使我使用list<>包装,而不是ilist<>。这当然打破了直接的nhibernate映射,因为nhibernate的ilist实现不能直接强制转换到列表中。

    **编辑:Windows工作流要求实际上意味着我将失去对列表的类型安全访问,不管它需要什么IList。

    现在的目标是序列化/反序列化这个对象。这对二进制序列化很好,但是当我尝试反序列化时,底层的nhibernate代理对象会爆炸并出现nhibernate错误。

    所以我尝试了XML序列化。序列化工作得很好,在序列化的XML文件中给出了我很好的具体类定义,它完全剥离了NHibernate代理。但是,在尝试反序列化此项时,我无法将这些项添加到列表中,因为items.aseNumerable.ToList调用不允许通过.add方法将项添加到基础列表中。

    有人对此有什么想法吗?我是不是走错了路?

    **编辑:nhibernate具体类是nhibernate.collection.generic.persistentgenericbag,它确实直接实现了ilist。但是,我失去了通用列表的所有类型安全优势。这使我回到了必须为每个子对象编写一个包装器的领域,我真的希望尽可能避免这种情况。

    5 回复  |  直到 13 年前
        1
  •  2
  •   Adriano Carneiro Tigran    13 年前

    on选项是创建自己的customlist实现,该实现是围绕实现ilist的实例进行包装。

    即:

    public CustomList<AnotherObject> Items    
    {      
        return new CustomList<AnotherObject>(items); 
    }
    

    也就是说,当你加入 CustomList<T> 它会添加到支持列表中。

    听起来好像只要你的类实现 IList 以及 IList<T> 你会没事的。

        2
  •  1
  •   Adam Robinson    15 年前

    是的,很遗憾你不能这样做。打电话 ToList() 创建列表的一个全新实例,因此当您向该实例添加项时,它们不会反映在原始列表中(正如您已经清楚地发现的那样)。

    我不使用NHibernate,但我想知道你的容器是否能实现 IList (非通用版本)。从您引用的线程中,似乎 System.Collections.IList 实际需要的是 List<T> ,这就是它工作的原因)。你的容器能实现吗 伊利斯特 ?

        3
  •  0
  •   fredrik alexandresoli    15 年前

    你不能像这样投吗?

    public class MyObject
    {
        private IList<AnotherObject> items;
        public List<AnotherObject> Items()
        {
            return (List<AnotherObject>)items;
        }
    }
    

    还没有机会尝试,但我认为它应该有效!

        4
  •  0
  •   Jamie Ide    15 年前

    我认为NHibernate PersistentBag(非通用)收集工具 IList 所以你可以输入项目 伊利斯特 而不是 IList<AnotherObject> . 问题中的链接指出问题在于复制器需要一个IList List<T> 但工具 IList<T> 不(去想)。

        5
  •  0
  •   Chris Doggett    15 年前

    是否可以将其强制转换为IEnumerable<t>?你可以试试这个:

    public class MyObject
    {
        private IList<AnotherObject> items;
        public List<AnotherObject> Items
        {
            return new List<AnotherObject>items.Cast<AnotherObject>());
        }
        // or, to prevent modifying the list
        public IEnumerable<AnotherObject> Items
        {
            return items.Cast<AnotherObject>();
        }
    }