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