在以下示例中,注释用于检查类型是否可实例化或可用:
class TypeContract
{
Type indicator;
public TypeContract(Type type)
{
// if (!type.IsInstantiable)
// {
// throw new ArgumentException();
// }
indicator = type;
}
}
作为参考,System.String
是可实例化的,但System.Convert
、IDictionary<,>
和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类文档。
之后,您可以检查可用的构造函数。