繁体   English   中英

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

[英]How to deserialize Enumerable.ToList<>() to List<>

我正在尝试构建一个看起来像这样的对象:

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

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

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

**编辑:Windows Workflow要求实际上意味着我将失去对列表的类型安全访问,无论它需要IList。

现在的目标是序列化/反序列化此对象。 这适用于二进制序列化,但当我尝试反序列化时,底层的NHibernate代理对象会出现nhibernate错误。

所以我尝试了xml序列化。 序列化工作正常,并在序列化的xml文件中给出了我很好的具体类定义,它完全剥离了nhibernate代理。 但是,当尝试反序列化时,我无法将项目添加到列表中作为items.AsEnumerable.ToList调用将不允许项目通过.Add方法添加到基础列表。

有没有人对此有任何想法? 我是以错误的方式来做这件事的吗?

**编辑:NHibernate具体类是NHibernate.Collection.Generic.PersistentGenericBag确实直接实现IList。 但是,我失去了通用列表的所有类型安全的好处。 这让我回到必须为每个子对象编写包装器的领域,如果可能的话我真的想避免这种情况。

选项是创建自己的CustomList实现,该实现是实现IList的实例的包装

即:

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

即,当您添加到CustomList<T>它会添加到支持列表中。

听起来只要你的类实现IList以及IList<T>就可以了。

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

我不使用NHibernate,但我很想知道你的容器是否实现了IList (非泛型版本)。 从您引用的线程看来, System.Collections.IList似乎是实际需要的(并且由List<T> ,这就是它工作的原因)。 你的容器是否实现了IList

你不能像这样投这个吗?

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

没有试图尝试它,但我认为它应该工作!

我认为NHibernate PersistentBag(非泛型)集合实现了IList因此您可以将项目类型化为IList而不是IList<AnotherObject> 您的问题中的链接指出问题是复制器需要一个IList,其中List<T>实现但IList<T>没有(如图)。

可以转换为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>();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM