GetType()何时返回RunTimeType,何时返回类似SampleProgram.MyClass1的类型?

时间:2014-01-21 15:39:52

标签: c# .net

我正在学习反思和GetType()方法。

我注意到,当我在应用程序中定义类型并调用GetType()方法时,它会返回对象的type(class)

Class1 first = new Class1();
Class2 second = new Class2();
Type firstType = first.GetType();
Type secondType = second.GetType();
Console.WriteLine(firstType.ToString());//prints Class1
Console.WriteLine(secondType.ToString());//prints Class2

在我使用Assembly.LoadFrom()加载其他程序集并使用foreach迭代这些类型的同时,GetType()会返回RunTimeType

foreach (Type t in AddInAssembly.GetTypes())
{
    if (t.IsClass && typeof(IAddIn).IsAssignableFrom(t))
    {
        AddInTypes.Add(t);
        Console.WriteLine(t.GetType());//prints RunTimeType
    }
}

发生了什么事?我的理解错了吗?任何人都可以对这种行为有所了解。

3 个答案:

答案 0 :(得分:6)

GetType()返回您调用它的实例的类型。

t是一个Type实例,因此它返回System.Type实际上是t的子类(通常是RuntimeType)。

这就像写"4".GetType().GetType()

答案 1 :(得分:5)

在这个例子中可能会更有意义:

Class1 someObj = new Class1();
Type type1 = someObj.GetType(); // Class1
Type type2 = type1.GetType(); // RuntimeType

在第一个示例中,您使用的是Class1Class2类型的对象,因此当您使用GetType()时,它会返回代表{{1}的Type s }和Class1

在第二个示例中,您使用的是Class2类型的对象,代表TypeClass1。当您对这些内容使用Class2时,会返回GetType()(扩展RuntimeType)。

作为进一步说明,以下是运行上述示例后每个变量的类型和内容:

Type

答案 2 :(得分:2)

文档中指定的

GetType返回:

  

当前实例的确切运行时类型。

在您的情况下,变量t被声明为Type t。对于GetType类型的实例,Type不会返回Typebecause

  

Type是一个允许多个实现的抽象基类。系统将始终提供派生类RuntimeType。在反射中,所有以单词Runtime开头的类只在系统中的每个对象上创建一次并支持比较操作。

但是,在您的示例中,如果您要将故障排除调用更改为:

Console.WriteLine(t.ToString());

你会得到你期望的结果。