如何判断一个类型是否是集合类型?

问题描述 投票:0回答:5
我试图确定运行时类型是否是某种集合类型。我下面的内容有效,但似乎很奇怪,我必须像我所做的那样,在数组中命名我认为是集合类型的类型。

在下面的代码中,通用逻辑的原因是因为,在我的应用程序中,我希望所有集合都是通用的。

bool IsCollectionType(Type type) { if (!type.GetGenericArguments().Any()) return false; Type genericTypeDefinition = type.GetGenericTypeDefinition(); var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) }; return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition)); }

我如何重构这段代码使其更智能或更简单?

c# collections types refactoring
5个回答
98
投票
实际上所有这些类型都继承了

IEnumerable

。您只能检查它:

bool IsEnumerableType(Type type) { return (type.GetInterface(nameof(IEnumerable)) != null); }
或者如果您确实需要检查

ICollection

bool IsCollectionType(Type type) { return (type.GetInterface(nameof(ICollection)) != null); }
看“语法”部分:

如果您需要排除字符串(本质上是 IEnumerable

),请使用以下函数:

bool IsEnumerableType(Type type) { return (type.Name != nameof(String) && type.GetInterface(nameof(IEnumerable)) != null); }
    

4
投票
您可以使用此辅助方法来检查类型是否实现了开放通用接口。根据您的情况,您可以使用

DoesTypeSupportInterface(type, typeof(Collection<>))



public static bool DoesTypeSupportInterface(Type type,Type inter) { if(inter.IsAssignableFrom(type)) return true; if(type.GetInterfaces().Any(i=>i. IsGenericType && i.GetGenericTypeDefinition()==inter)) return true; return false; }

或者您可以简单地检查非通用

IEnumerable

。所有的集合接口都继承自它。但我不会将任何实现 
IEnumerable
 的类型称为集合。


1
投票
您可以使用 linq,搜索接口名称,例如

yourobject.GetType().GetInterfaces().Where(s => s.Name == "IEnumerable")

如果它有值,则为

IEnumerable

 的实例。


1
投票
此解决方案将解决

ICollection

ICollection<T>

static bool IsCollectionType(Type type) { return type.GetInterfaces().Any(s => s.Namespace == "System.Collections.Generic" && (s.Name == "ICollection" || s.Name.StartsWith("ICollection`"))); }
    

0
投票
这对我有用。

private static bool IsCollectionType(Type type) { return type.GetInterfaces().Any(s => s.Namespace == "System.Collections.Generic" && (s.Name == "IEnumerable" || s.Name.StartsWith("IEnumerable`"))); }
    
© www.soinside.com 2019 - 2024. All rights reserved.