2011-01-12 9 views
0

私がやりたいすべてのようになります。クラスの取得方法.NETの基本クラスの静的メソッドを入力しますか?

public abstract class BaseClass 
{ 
    public static Type GetType() 
    { 
     return typeof(BaseClass); 
    } 
} 

しかし、私は

public class DerivedClass : BaseClass 
{ 
} 

それを引き出すとき、私はこの主張をするためにBaseClassのを変更する方法

Assert.AreEqual(typeof(DerivedClass), DerivedClass.GetType()); 

を取得したいです本当ですか?

+0

これはコンパイルされません。 – asawyer

+0

それはコンパイルされません - あなたの意図を明確にすることはできますか? –

+2

これは意味をなさない。なぜ静的メソッドから 'GetType'を呼びたいのですか? – Gabe

答えて

1

静的メソッドは継承されません。

b)は、非常に似た何かをBaseClassための拡張メソッドを定義します。

DerivedClassには、派生クラスの1つを介して基本クラスの静的メソッドを呼び出すときにコンパイラがBaseClassを代入します。たとえば、DerivedClass.GetType()への呼び出しのILコードは次のとおりです。

IL_0002: call class [mscorlib]System.Type Tests.Program/BaseClass::GetType() 
2

派生型への唯一のルートがインスタンスのものであり、静的メソッドがインスタンスをとらないため、これを行うことはできません。

私はあなたの例が単純であることを願っています。なぜなら、GetType()を再実装するのはちょっと意味がないようです。object.GetType()はあなたが望むものを正確に実行するからです。

実際に静的に呼び出されたメソッドでこれを行う必要がある場合は、静的メソッドで実際に使用できる型情報がないため(最初の段落で説明したように)できません。

あなたが実際にインスタンスを経由してこのメ​​ソッドを呼び出します(ただし!?なぜ私が尋ねる必要があります)、あなたは、次の

a)は、あなたの方法ベースのインスタンスメソッド作るのいずれかを行うことができます。それからthis.GetType()(.Netベースメソッドを使用)を実行すると、インスタンスの最終的なサブタイプが返されます。

public static Type GetType2(this BaseClass instance) 
{ 
    return instance.GetType(); 
} 
関連する問題