关于TYPE对象的2个问题。 Type对象是引用类型吗?如果这是一个抽象类,我们如何创建TYPE对象?

时间:2018-11-06 08:51:48

标签: c# types gettype

Type对象是引用类型吗?
假设我有以下代码:

String s = "AAA";
Type b = s.GetType();

b是否指向堆上的类型对象?

如何为抽象类创建TYPE对象?
再次这段代码:

String s = "AAA";
Type b = s.GetType();

如果s.GetType();是一个抽象类,如何创建TYPE对象? 您无法创建抽象类的实例。

所以Object.GetType()方法返回一个从System.Type派生的类型,即System.RuntimeType-我知道。但是哪个对象通过typeof(object)返回?因为类型类本身是抽象的,所以它也应该是从System.Type派生的类型。这种类型的名字是什么?

3 个答案:

答案 0 :(得分:0)

.NET运行时实现了非虚拟方法Object.GetType()。它返回被调用对象的类型信息。

返回的Type的实际实现是实现细节,但是.NET运行时将返回从System.Type派生的类型,即System.RuntimeType。另请参见What's the difference between System.Type and System.RuntimeType in C#?

关于您的编辑:

  

哪个对象由typeof(object)返回?

typeof(T)被编译为Type.GetTypeFromHandle(),该方法返回的Type派生类型再次是实现细节。

  

我只想知道如果类型对象是抽象类,那么如何创建类型对象?

不能。 mscorlib库包含public abstract class System.Type继承的public abstract class System.TypeInfo,而internal class RuntimeType继承了public Type GetType() { var typeInfo = new RuntimeType(); // set some properties return typeInfo(); } 。因此在内部,CLR会执行以下操作:

RuntimeType

并且由于Type继承自wrapper.instance(),因此可以从该方法返回该类型的实例。

答案 1 :(得分:0)

  

b是否指向堆上的类型对象?

是的,因为System.Type是引用类型,所以它总是分配在堆上。

  

如何为抽象类创建TYPE对象?

var t = typeof(MyAbstractClass);

答案 2 :(得分:-1)

您可以在官方文档中轻松获得有关此信息。请参阅docs

类型不指向实际对象。它只是获取有关对象类型的信息。

由于您无法创建抽象类的实例,因此您将无法在该类上调用GetType。