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

2
@BrokenGlass通常はそれを行うだけですが、コンピューターではありません...問題の解決策が形成され始めていて、今知りたいと思っていたので、電話を使用して投稿を作成しました!= P
Feisty Mango 2011

回答:


133

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

あなたのGetSubType()方法に理由はありません。


それはそうですか?その(抽象)スーパークラスからオブジェクトのインスタンスを渡していますが、レシーバーはスーパークラスしか見えません。ハンドルがインスタンスではないと定義されたものを常に返すということではありませんか?-または何か不足していますか?

Ah ha ..違いはTypeOf(X)とx.GetType()を使用していることだと思います

22

GetType常に実際にインスタンス化された型を常に返します。つまり、最も派生したタイプです。これは、あなたのGetSubType振る舞いはGetTypeそれ自体と同じであり、したがって不要であるということを意味します。

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

ただし、コードに誤りがあります:notをSystem.Attribute.GetCustomAttributes返します。Attribute[]Type


7

GetTypeは常に実際のタイプを返します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.