web-dev-qa-db-ja.com

GetType()は、基本クラスから呼び出されたときに最も派生した型を返しますか?

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();
   }
}
112
Feisty Mango

GetType()は、実際のインスタンス化されたタイプを返します。あなたの場合、BのインスタンスでGetType()を呼び出すと、問題の変数がAへの参照として宣言されていても、typeof(B)を返します。

GetSubType()メソッドを使用する理由はありません。

127
Reed Copsey

GetTypeは常に、実際にインスタンス化された型を返します。つまり、最も派生した型です。つまり、GetSubTypeGetType自体と同じように動作するため、不要です。

ある型の型情報を静的に取得するには、typeof(MyClass)を使用できます。

ただし、コードに誤りがあります。System.Attribute.GetCustomAttributesTypeではなくAttribute[]を返します。

22
CodesInChaos

GetTypeは常に実際の型を返します。

その理由は、 。NET フレームワークと [〜#〜] clr [〜#〜]の奥深くにあります。 、JITおよびCLRは.GetTypeメソッドは、オブジェクトに関する情報を保持するTypeオブジェクトをメモリに作成します。オブジェクトへのすべてのアクセスとコンパイルは、このTypeインスタンスを介して行われます。

詳細については、Microsoft Pressの書籍「CLR via C#」を参照してください。

7
yoel halb