C# - 如何检查一个类型是否为具体类型?

8

我有一个类型的集合,我想过滤掉每个不具体的类型。

我可以看到我可以检查 isAbstract 和 isInterface 来捕获大多数非具体类型,但这会漏掉什么吗?

有一个"isConcrete"属性吗?


2
任何不是抽象或接口的东西都是具体的。这并不意味着你一定可以实例化它, - Asad Saeeduddin
2
IsAbstract 也可以捕获接口。 - Andrew Whitaker
2个回答

10

我猜如果你尝试使用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; }

1
结构体是值类型,因此IsClass将为false。您想让结构体被视为具体类吗?如果是,请删除IsClass条件。 - KC-NH
对于那些在很久之后偶然发现这个问题的人来说,值得注意的是:isConcreteType(typeof(List<>)) 将会通过测试,尽管很可能并不是原帖作者考虑到的测试案例之一。基于以上情况,我认为应该将 !type.IsGenericTypeDefinition && !type.IsGenericParameter 添加到条件中。 - Dantte

3
IsAbstract的反义词是“具体的”,所以您可以使用这些检查。

2
可能是一个接口。 - Haney
3
@Haney: 我认为IsAbstract对于接口也返回true - Andrew Whitaker
@AndrewWhitaker 我认为你是对的。刚刚在 System.Collections.IEnumerable 上进行了测试,结果为 true - Haney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接