当从基类调用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()
将返回实际的实例化类型。在您的例子中,如果在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);
}
}
}