C# 如何反序列化可枚举。ToList<&燃气轮机;()列出<&燃气轮机;

C# 如何反序列化可枚举。ToList<&燃气轮机;()列出<&燃气轮机;,c#,nhibernate,xml-serialization,workflow-foundation,C#,Nhibernate,Xml Serialization,Workflow Foundation,我正在尝试构建一个如下所示的对象: public class MyObject { private IList<AnotherObject> items; public List<AnotherObject> Items { return items.AsEnumerable().ToList<AnotherObject>(); } } 公共类MyObject { 私有IList)这基本上迫使我使用列表

我正在尝试构建一个如下所示的对象:

  public class MyObject
  {
    private IList<AnotherObject> items;
    public List<AnotherObject> Items
    {
      return items.AsEnumerable().ToList<AnotherObject>();
    }
  }
公共类MyObject
{
私有IList)这基本上迫使我使用列表包装器而不是IList。这当然打破了直接的NHibernate映射,因为NHibernate的IList实现不能直接转换到列表

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

现在的目标是序列化/反序列化这个对象。这在二进制序列化中可以很好地工作,但是当我尝试反序列化它们时,底层的NHibernate代理对象会因NHibernate错误而爆炸

因此,我尝试了xml序列化。序列化工作正常,并在序列化的xml文件中为我提供了很好的具体类定义,从而完全删除了nhibernate代理。但是,在尝试反序列化时,我无法将项添加到列表中,因为items.AsEnumerable.ToList调用不会将项添加到und中通过.Add方法创建列表

有人对此有什么想法吗?我走错方向了吗


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

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


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

上的选项是创建您自己的CustomList实现,它是实现IList的实例的包装器

i、 e:

公共自定义列表项
{      
返回新的客户列表(项目);
}
i、 e.当您添加到
客户列表时,它会添加到支持列表中


听起来只要你的类实现了
IList
以及
IList
,你就没事了。

你就不能这样强制转换它吗

public class MyObject
{
    private IList<AnotherObject> items;
    public List<AnotherObject> Items()
    {
        return (List<AnotherObject>)items;
    }
}
公共类MyObject
{
私人物品;
公共物品清单()
{
退货(清单)项目;
}
}

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

我认为NHibernate PersistentBag(非通用)集合实现了
IList
,因此您可以将项目键入为
IList
,而不是
IList
。您问题中的链接指出,问题是replicator需要一个IList,它实现了
List
,但是
IList
没有(见图)。

它可以转换为IEnumerable吗?您可以尝试以下方法:

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>();
    }
}
公共类MyObject
{
私人物品;
公共清单项目
{
返回新的Listitems.Cast());
}
//或者,防止修改列表
公共数字项目
{
returnitems.Cast();
}
}

为了适应NHibernate,我必须使用IList,但Windows工作流需要列表。NHibernate.Collection.Generic.PersistentGenericBag确实实现了IList。我可以使用它,但随后我失去了我不想做的通用列表的类型安全性。另一种方法是按照Alex的建议编写一个包装器,但它这不是我的理想解决方案。无论你做什么,你都会失去类型安全性。这就是为什么List不实现IList;它要求你打开一个接口,该接口在语法上允许你添加一个实际上与泛型类型不匹配的元素。你要在“另一端”访问这个IList吗关于序列化?如果是这样的话,你不能将其转换回IList吗?实际上我没有考虑过。基于与Windows Workflow的必要集成,我别无选择,只能失去类型安全访问器。我有一些想法,我将要看一看,我将回到这个问题上这不起作用,因为IList中的底层对象是NHibernate.Collection.Generic.PersistentGenericBag,它不能直接转换到列表中。我正在考虑包装器路径,但我真的不想为我的域模型中的每个子对象编写包装器。泛型有什么意义n?:)不过,我承认这可能是最后的解决方案。我正在使用的当前解决方案有一个实现IList和IList的包装器类。编写非泛型方法是为了进行类型检查。但基本上它只是包装一个内部IList。请参阅上面Adam的评论,了解IList为什么不实现IList。我没有这样做在我之前仔细考虑一下。我需要一个用于Windows工作流的IList。
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>();
    }
}