使用Reflection </t>将NHibernate.Collections.Generic.PersistentGenericBag检索为IList <t>

时间:2010-02-08 18:57:38

标签: c# nhibernate reflection

我正在尝试将瞬态对象图与NHibernate持久化对象图进行比较。不幸的是,我的代码在涉及IList<T>类型的属性时会中断。以下代码适用于List<T>的实例,因为List<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&lt; T&gt;用反射?

我原本希望受欢迎的Compare .NET Objects类会有所帮助,但它会因完全相同的错误而失败。

编辑:以下所有答案都在正确的轨道上。问题是有问题的IList<T>属性的getter正在尝试转换为List<T>,显然无法对PersistentGenericBag进行转换。所以,我对错误引导的问题的错。

2 个答案:

答案 0 :(得分:3)

编辑:没关系。评论者是对的,你可以直接去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;

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

答案 1 :(得分:1)

您不需要IList来比较两个集合。

转而转向IEnumerable