我正在尝试将瞬态对象图与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进行转换。所以,我对错误引导的问题的错。
答案 0 :(得分:3)
好的,你只需要深入挖掘一下。
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
。