2011-08-15 296 views
5

我有一個方法,需要輸入參數IEnumerable類型的對象。我想枚舉枚舉併爲每個項目使用反射來獲取每個屬性的值。爲什麼Type.GetElementType返回null?

我有以下代碼:

protected void WriteData(IEnumerable data) 
{ 
    var enumerationTypeInfo = data.GetType(); 
    var itemTypeInfo = enumerationTypeInfo.GetElementType(); 

    ... 
} 

問題是enumerationTypeInfo.GetElementType()總是返回null。特別是,我將List<Entry>傳入WriteData,其中Entry是我創建的類。當我使用調試器並設置一個斷點時,我可以看到enumerationTypeInfo正確顯示它是一個類型爲Entry的列表,但爲什麼GetElementType返回null

感謝

回答

7

GetElementType是與陣列,而不是其他泛型類使用。要獲得泛型類型的泛型參數,可以使用Type.GetGenericArguments

+0

此外 - 如果用於泛型類型,GetElementType將始終返回null。 請參閱MSDN文章http://msdn.microsoft.com/en-us/library/system.type.getelementtype.aspx – EtherDragon

12

GetElementType()返回數組的元素類型。 List<T>不是數組類型,因此沒有「元素類型」。

如果你想獲得元素隨機IEnumerable<T>產生的類型,嘗試這樣的事情:

public static Type GetEnumerableType(Type type) 
{ 
    if (type == null) 
     throw new ArgumentNullException("type"); 

    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>)) 
     return type.GetGenericArguments()[0]; 

    var iface = (from i in type.GetInterfaces() 
       where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>) 
       select i).FirstOrDefault(); 

    if (iface == null) 
     throw new ArgumentException("Does not represent an enumerable type.", "type"); 

    return GetEnumerableType(iface); 
} 

注意,類型可以實現相同的通用接口的多個版本;例如,類型可以實現IEnumerable<int>IEnumerable<string>。你如何處理這個案子取決於你。我提供的方法將採用運行環境首先使用的任何接口類型。


請參閱an example using the above method關於ideone。