从基类调用时,GetType()是否会返回派生最多的类型?


118

从基类调用时,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();
   }
}

10
好-您是否尝试过?
BrokenGlass 2011年

2
@BrokenGlass通常我会那样做,但是我不在电脑旁……只是用我的手机发帖,因为问题的解决方案开始形成,我很好奇现在知道!= P
Feisty Mango

Answers:


133

GetType()将返回实际的实例化类型。就您而言,如果您调用GetType()的实例B,则typeof(B)即使有问题的变量被声明为对的引用,它也会返回A

没有理由使用您的GetSubType()方法。


会吗?我正在从其(抽象)超类传递一个对象的实例,接收者只能看到该超类。难道不是它将始终返回定义为不是实例的句柄吗?-或者我想念什么吗?

啊哈..区别是我认为使用TypeOf(X)与x.GetType()

22

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

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

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


7

GetType始终返回实际类型。

其原因在.NET Framework和CLR中很深,因为JIT和CLR使用此.GetType方法在内存中创建一个Type对象,该对象保存有关该对象的信息,并且对该对象的所有访问和编译均通过此Type实例进行。 。

有关更多信息,请参阅Microsoft Press的“通过C#进行CLR”一书。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.