2016-08-12 146 views
0

我試圖創建一個泛型參數的方法:如何檢查C#泛型類型是否爲集合(IEnumerable)?

public List<DTListItem> MapDTListResponse(List<App.Order.DT> dtList) 
{ 
    return dtList.Select(MapDTListResponse).ToList(); 
} 

public DTListItem MapDTListResponse(App.Order.DT dt) 
{ 
    return RecMap<DTListItem, App.Order.DT>(dt); 
} 

private T RecMap<T,TU>(TU newObject) 
{ 
    if (TU is IEnumerable) // this doesn't work; what do i check for here 
    { 
     //Also, how do i get this bit to replicate MapDTListReponse 
     newObject.Select(RecMap).ToList(); 
    } 
    else 
    { 
     return Mapper.Map<T>(newObject); 
    }    
} 

正如你可以看到,第一種方法需要和返回的集合,只是調用第二種方法(具有相同的名稱但不同的簽名)集合中的每個元素。

我想創建一個通用的方法來處理這兩種情況。如果集合通過,它應該自動調用。爲此,我需要檢查,如果該類型是IEnumerableT is IEnumerable有以下錯誤

TU行是一個類型,是不是在給定的範圍內有效。

此外,newObject.Select(Map).ToList();有以下錯誤

TU不包含定義選擇

回答

1

is運營商需要在其左側的一個對象實例,所以它可以」不要這樣使用。相反,你可以這樣做:

if (newObject is IEnumerable) // ... 

而且因爲你想以後使用該實例作爲一個集合,你可以使用as操盤手:

var newCollection = newObject as IEnumerable<T>; 
if (newCollection != null) // ... 

值得指出的是,在情況下,你已經是一個類型(而不是實例),您可以通過Type類的IsAssignableFrom方法達到同樣的事情,就像這樣:

public static bool IsSequence<T>() => typeof(IEnumerable).IsAssignableFrom(typeof(T)); 
+0

謝謝,T帽子似乎有幫助。我已經將if循環更改爲if(typeof(IEnumerable).IsAssignableFrom(typeof(TU)))',但是它仍然不讓我調用IEnumerable.select方法(我的問題的第二部分)。 – Ash

+0

@AshwinNair你是對的,看看編輯。 –

+0

在將'TU'作爲'IEnumerable'投下之後,'select'下的錯誤消失了,但是我無法複製第一個方法的功能,因爲它現在試圖返回一個'List '。我猜測沒有辦法用一種方法來做到這一點。 – Ash