当从基类调用GetType()时,会返回最派生的类型吗?

本文关键字:派生 返回 类型 调用 基类 GetType | 更新日期: 2023-09-27 17:52:45

当从基类调用时,GetType()将返回最派生的类型吗?

的例子:

public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}
public class B : A
{
   //Fields here have some custom attributes added to them
}

或者我应该做一个抽象方法,派生类必须像下面这样实现?

public abstract class A
{
    protected abstract Type GetSubType();
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}
public class B : A
{
   //Fields here have some custom attributes added to them
   protected Type GetSubType()
   {
       return GetType();
   }
}

当从基类调用GetType()时,会返回最派生的类型吗?

GetType()将返回实际的实例化类型。在您的例子中,如果在B的实例上调用GetType(),它将返回typeof(B),即使所讨论的变量被声明为对A的引用。

你的GetSubType()方法没有原因

GetType总是返回实际实例化的类型。即最派生的类型。这意味着您的GetSubType的行为就像GetType本身一样,因此是不必要的。

要静态地获取某种类型的类型信息,可以使用typeof(MyClass)

你的代码有一个错误:System.Attribute.GetCustomAttributes返回Attribute[]而不是Type

GetType总是返回实际的类型。

它的原因在。net框架和CLR中很深,因为JIT和CLR使用.GetType方法在内存中创建一个保存对象信息的Type对象,并且所有对对象的访问和编译都是通过这个Type实例。

有关更多信息,请参阅Microsoft Press出版的《CLR via c#》一书。

输出:

GetType:
        Parent: 'Playground.ParentClass'
        Child: 'Playground.ChildClass'
        Child as Parent: 'Playground.ChildClass'
GetParentType:
        Parent: 'Playground.ParentClass'
        Child: 'Playground.ParentClass'
        Child as Parent: 'Playground.ParentClass'

Program.cs:

using Playground;
var parent = new ParentClass();
var child = new ChildClass();
var childAsParent = child as ParentClass;
Console.WriteLine("GetType:'n" +
                  $"'tParent: '{parent.GetType()}''n" +
                  $"'tChild: '{child.GetType()}''n" +
                  $"'tChild as Parent: '{childAsParent.GetType()}''n");
Console.WriteLine("GetParentType:'n" +
                  $"'tParent: '{parent.GetParentType()}''n" +
                  $"'tChild: '{child.GetParentType()}''n" +
                  $"'tChild as Parent: '{childAsParent.GetParentType()}''n");

ChildClass.cs

namespace Playground
{
    public class ChildClass : ParentClass
    {
    }
}

ParentClass.cs

namespace Playground
{
    public class ParentClass
    {
        public Type GetParentType()
        {
            return typeof(ParentClass);
        }
    }
}