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()
を呼び出すと、問題の変数がA
への参照として宣言されていても、typeof(B)
を返します。
GetSubType()
メソッドを使用する理由はありません。
GetType
は常に、実際にインスタンス化された型を返します。つまり、最も派生した型です。つまり、GetSubType
はGetType
自体と同じように動作するため、不要です。
ある型の型情報を静的に取得するには、typeof(MyClass)
を使用できます。
ただし、コードに誤りがあります。System.Attribute.GetCustomAttributes
はType
ではなくAttribute[]
を返します。
GetTypeは常に実際の型を返します。
その理由は、 。NET フレームワークと [〜#〜] clr [〜#〜]の奥深くにあります。 、JITおよびCLRは.GetType
メソッドは、オブジェクトに関する情報を保持するTypeオブジェクトをメモリに作成します。オブジェクトへのすべてのアクセスとコンパイルは、このTypeインスタンスを介して行われます。
詳細については、Microsoft Pressの書籍「CLR via C#」を参照してください。