2010-02-08 58 views
2

我試圖比較暫時的對象圖到NHibernate持久對象圖。不幸的是,我的代碼打破了IList<T>類型的屬性。以下代碼適用於List<T>的實例,因爲List<T>實現了IList<T>IList。不幸的是,NHibernate的PersistentGenericBag只實現了IList<T>檢索NHibernate.Collections.Generic.PersistentGenericBag作爲IList <T>使用反射

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

如果任object1或對象2是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 <牛逼>一種可靠的方式?

我曾希望流行的Compare .NET Objects類會有所幫助,但它失敗,具有完全相同的錯誤。

編輯:以下所有答案都是正確的。問題在於有問題的IList<T>屬性上的吸氣劑試圖將其轉換爲List<T>,這顯然無法對PersistentGenericBag進行。所以,我的錯是因爲這個被誤導的問題。

+0

比較項目可能存在的問題是,它不會深入到對象中,直到找到IList實現。 – 2010-02-09 02:10:15

+0

錯誤表示您正在嘗試投射到列表(具體),* not * IList (interface) – 2010-02-09 02:15:14

+0

PersistentGenericBag * does *實現IList和IList ,請參閱http://www.surcombe.com/nhibernate -1.2/api/html/T_NHibernate_Collection_Generic_PersistentGenericBag_1.htm – 2010-02-09 02:17:46

回答

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

您不需要IList來比較兩個集合。

轉而使用IEnumerable

+0

無論出於何種原因,「(IEnumerable)prop1.GetValue(object1,null);」產生完全相同的錯誤。 – 2010-02-08 21:14:18

+0

你確定prop1和object1是你正在尋找的屬性和對象嗎?你在調試器中看過他們(和調用結果)嗎? – 2010-02-09 11:06:05