2012-09-06 48 views
0

我有這樣的:如何通過反射來區分集合與單個對象?

var Virtual = Property.GetValue(Entity, null); 

實體正在使用實體框架的倉庫拉。

如何確定它是單個對象還是集合?

我試着檢查類型,但不確定要比較它。

​​

經檢查與調試器,虛擬或者是一個實例化的單classDynamicProxy,或實例化的ICollectionHashSet。如果.GetType()是在DynamicProxy用這個被拋出:

Object reference not set to an instance of an object. 

我也試過這樣:

var test = (IEnumerable<object>)Virtual; 
if (test.Count() > 0) 

其作品的收集,但無法在單個對象上。

我也試過這樣:

if (Virtual is Enumerable) 

,但它是假的,即使是集合。

我如何通過反思來辨別兩者?

+2

'Enumerable'是一個靜態類 - 你想'如果(虛擬是IEnumerable)' – Lee

+1

你嘗試過測試虛擬是IEnumerable。 IEnumerable將是泛型和非泛型集合,枚舉等的共同特徵。請記住,該字符串也實現了IEnumerable,但可能不應將其視爲集合。 – LeffeBrune

+0

@Lee - 謝謝,這確實沒有拋出異常。 –

回答

1

剛剛看你的代碼快速猜測。

//works for collection but throws exception for single object (as it should) 
var test = (IEnumerable<object>)Virtual; 

//try using 
var test = Virtual as IEnumerable; 
if(test == null) // single object 

這是一樣的

if(Virtual is IEnumerable){} 
1

檢查是否實現IEnumerable

if (Virtual is IEnumerable) 
{ 
    // ... 
} 
+0

這假設每個EF集合都從'ICollection'繼承,因爲常規的'IEnumerable <>'不會,但是任何路由都是+1。 –

+0

@StanR。我改變它來檢查'IEnumerable'這應該工作,因爲'ICollection'本身從'IEnumerable'繼承。 –

0

Type.IsAssignableFrom()是確定什麼樣的任務類型支持非常有用的方法:

if (VirtualType.IsAssignableFrom(typeof(ICollection)) { 
    // Do something 
}