[英]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.