我有一个类型的集合,我想过滤掉每个不具体的类型。
我可以看到我可以检查 isAbstract 和 isInterface 来捕获大多数非具体类型,但这会漏掉什么吗?
有一个"isConcrete"属性吗?
我猜如果你尝试使用IsClass && !IsAbstract
,这个方法可能会起作用?
if isConcreteType(myType) { DoSomething(); }
bool isConcreteType(Type type) {
return type.IsClass && !type.IsAbstract && !type.IsInterface;
}
根据KC-NH的评论:
所以,如果您想将结构体视为具体类型,您必须放弃结构体是值类型,因此IsClass将为false。如果你想让结构体被视为具体类,那么请移除IsClass条件。
IsClass
的限制。bool isConcreteType(Type type) { return !type.IsAbstract && !type.IsInterfaces; }
isConcreteType(typeof(List<>))
将会通过测试,尽管很可能并不是原帖作者考虑到的测试案例之一。基于以上情况,我认为应该将 !type.IsGenericTypeDefinition && !type.IsGenericParameter
添加到条件中。 - DantteIsAbstract
对于接口也返回true
。 - Andrew WhitakerSystem.Collections.IEnumerable
上进行了测试,结果为 true
。 - Haney
IsAbstract
也可以捕获接口。 - Andrew Whitaker