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

时间:2015-12-15 15:02:19

标签: c# .net reflection types

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

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)

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

类是静态的:type.IsAbstract && type.IsSealed(请参阅this question

Class是一个接口:type.IsInterface

类是枚举:type.IsEnum

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

查看Type类here的文档,了解有关其提供的属性的更多信息。

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