代码之家  ›  专栏  ›  技术社区  ›  nw.

使用反射检索nhibernate.collections.generic.persistengenericbag as ilist<t>

  •  2
  • nw.  · 技术社区  · 16 年前

    我试图将一个瞬态对象图与一个nhibernate持久化对象图进行比较。不幸的是,我的代码在类型为 IList<T> 很担心。下面的代码适用于 List<T> ,因为 列表<t> 实现两者 IList<t> IList . 不幸的是,nhibernate的persistentGenericBag只实现 IList<t> .

    IList list1 = (IList)prop1.GetValue(object1, null);
    IList list2 = (IList)prop2.GetValue(object2, null);
    

    如果object1或object2是persistentGenericBag,我会得到一个错误,例如:

    System.Reflection.TargetInvocationException : Exception has been thrown
    by the target of an invocation.
      ----> System.InvalidCastException : Unable to cast object of type
    'NHibernate.Collection.Generic.PersistentGenericBag`1[MyNamespace.MyClass]'
    to type 'System.Collections.Generic.List`1[MyNamespace.MyClass]'.
    

    是否有可靠的方法使用反射将persistentGenericBag实例检索为IList<t>?

    我希望大众 Compare .NET Objects 类会有帮助,但它会失败,并出现完全相同的错误。

    编辑: 下面所有的答案都是正确的。问题是问题的关键在于 IList<t> 属性正在尝试强制转换为 列表<t> ,这显然不能对persistentGenericBag执行。所以,我错在了错误的问题上。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Sky Sanders    16 年前

    编辑:没关系。评论者是对的,你可以直接去IList。我把重点放在一个问题上,就像上面说的那样,即使我在编写答案的时候,也很难看到明显的问题。呸!

    好吧,你只需要再深入一点。

    persistentGenericBag的基类是persistentBag,它 执行IList。

    var prop1 = typeof (Customer).GetProperty("Invoice");
    
    // if you need it for something...
    var listElementType = prop1.PropertyType.GetGenericArguments()[0];
    
    IList list1;
    
    
    object obj = prop1.GetValue(object1, null);
    
    if(obj is PersistentBag)
    {
        list1 = (PersistentBag)obj;
    }
    else 
    {
        list1 = (IList)obj;
    }
    
    foreach (object item in list1)
    {
        // do whatever you wanted.
    }
    

    测试和工作袋。对于您可能遇到的其他列表/集/集合类型,将其作为逻辑结论。

    所以,简单的答案是:如果你知道它是一个包,你可以先将对象投射到persistentbag,然后投射到ilist…

    IList list = (PersistentBag)obj;
    

    如果你不知道,那么使用一些条件逻辑如图所示。

        2
  •  1
  •   Diego Mijelshon    16 年前

    你不需要 IList 比较两个集合。

    铸造成 IEnumerable 相反。