簡體   English   中英

如何檢查C#泛型類型是否為集合(IEnumerable)?

[英]How do I check if a C# generic type is a collection (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);
    }            
}

如您所見,第一個方法獲取並返回一個集合,並為該集合中的每個元素簡單地調用第二個方法(名稱相同但簽名不同)。

我想創建一個處理這兩種情況的通用方法。 如果傳遞了一個集合,它應該自行調用。 為此,我需要檢查類型是否為IEnumerable但行T is IEnumerable具有以下錯誤

TU是在給定上下文中無效的類型。

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

TU不包含“選擇”的定義

is運算符在其左側使用一個對象實例,因此不能那樣使用它。 相反,您可以這樣做:

if (newObject is IEnumerable) // ...

並且由於您以后想要將該實例用作集合,因此可以改為使用as運算符:

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

值得指出的是,如果您擁有的只是一個類型(而不是實例),則可以通過Type類的IsAssignableFrom方法實現相同的IsAssignableFrom ,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM