繁体   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