2016-08-12 248 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