【问题标题】:Determine if type is instantiable or usable确定类型是可实例化的还是可用的
【发布时间】:2015-12-15 23:29:31
【问题描述】:

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

class TypeContract
{
    Type indicator;

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

        indicator = type;
    }
}

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

C# 编译器如何检查这个?有可靠的类型属性吗?也许它使用手动检查,例如:

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

【问题讨论】:

  • "作为参考,System.String 是可实例化的,但 System.ConvertIDictionary<,>TKey 不是。"你说的究竟是什么意思?你想强加什么标准?
  • “Is Instantiantiable”是指价值与参考类型吗?或者你的意思是“有一个我可以使用的公共构造函数?”或者甚至两者兼而有之?
  • 请注意,您提到的TKey 是不正确的。由于您在运行时通过Type 检查元数据,因此TKey 可能是可实例化的,具体取决于为其传递的Type
  • 那些具有通过公共静态方法公开的私有构造函数的类呢?
  • 实际上您可以通过typeof 访问所有类型(包括不可实例化的接口)。

标签: c# .net reflection types


【解决方案1】:

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

你可以检查它是否返回一个空列表

【讨论】:

    【解决方案2】:

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

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

    类是一个接口:type.IsInterface

    类是一个枚举:type.IsEnum

    类是泛型参数:type.IsGenericParameter

    查看 Type 类 here 的文档以获取有关它提供的属性的更多信息。

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

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 2013-02-08
      • 2011-05-20
      • 2022-10-18
      相关资源
      最近更新 更多