2011-01-12 81 views
0

所有我想要做的是類似於:如何獲取類在.NET中輸入基類靜態方法?

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

但是,當我得到它

public class DerivedClass : BaseClass 
{ 
} 

我想

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

如何更改BaseClass的,使這個說法真正?

+0

這不會編譯。 – asawyer 2011-01-12 13:17:30

回答

1

靜態方法不能繼承。

編譯器用BaseClass代替DerivedClass,通過其派生類之一調用基類的靜態方法。例如,以下是撥打DerivedClass.GetType()的IL代碼:

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

你不能這樣做,因爲從它的基地之一,以派生類型你唯一的途徑是從一個實例 - 和靜態方法沒有考慮一個實例。

我希望你的例子是爲了簡單,因爲否則重新實現GetType()似乎有點沒有意義 - 因爲object.GetType()將做你想要的。

如果你確實需要通過一個靜態調用的方法來做到這一點 - 你不能因爲任何類型的信息是實際可用靜態方法(如我在第一段說的)。

如果你實際上是通過一個實例調用此方法(但我要問爲什麼!?),那麼你可以做以下

a)使你的方法的基礎上的實例方法之一。然後,它可以執行this.GetType()(使用.Net基本方法),它將返回實例的最終子類型。

B)定義BaseClass的擴展方法,做一些非常相似:

public static Type GetType2(this BaseClass instance) 
{ 
    return instance.GetType(); 
} 
相關問題