【发布时间】: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.Convert、IDictionary<,> 和 TKey 不是。请注意,就类而言,构造函数的可访问性不是问题。
C# 编译器如何检查这个?有可靠的类型属性吗?也许它使用手动检查,例如:
!((type.IsAbstract && type.IsSealed) || type.IsGenericParameter || type.ContainsGenericParameters)
【问题讨论】:
-
"作为参考,
System.String是可实例化的,但System.Convert、IDictionary<,>和TKey不是。"你说的究竟是什么意思?你想强加什么标准? -
“Is Instantiantiable”是指价值与参考类型吗?或者你的意思是“有一个我可以使用的公共构造函数?”或者甚至两者兼而有之?
-
请注意,您提到的
TKey是不正确的。由于您在运行时通过Type检查元数据,因此TKey可能是可实例化的,具体取决于为其传递的Type。 -
那些具有通过公共静态方法公开的私有构造函数的类呢?
-
实际上您可以通过
typeof访问所有类型(包括不可实例化的接口)。
标签: c# .net reflection types