确定类型是可实例化的还是可用的

本文关键字:实例化 类型 | 更新日期: 2023-09-27 18:26:49

在以下示例中,注释用于检查类型是否可实例化或可用:

class TypeContract
{
    Type indicator;
    public TypeContract(Type type)
    {
        // if (!type.IsInstantiable)
        // {
        //    throw new ArgumentException();
        // }
        indicator = type;
    }
}

作为参考,System.String是可实例化的,但System.ConvertIDictionary<,>TKey不是。请注意,构造函数的可访问性不是类所关心的问题。

C#编译器是如何检查的?是否存在可靠的类型属性?Perhabs使用手动检查,如:

!((type.IsAbstract && type.IsSealed) || type.IsGenericParameter || type.ContainsGenericParameters)

确定类型是可实例化的还是可用的

Type.GetConstructors返回类的公共构造函数。

您可以检查它是否返回空列表

获取类的Type对象并检查以下属性:

类是静态的:type.IsAbstract && type.IsSealed(见此问题)

类是一个接口:type.IsInterface

类是枚举:type.IsEnum

类是一个通用参数:type.IsGenericParameter

有关Type类提供的属性的详细信息,请查看此处的Type类文档。

之后,您可以检查可用的构造函数。