2010-05-25 44 views
1

假設我們有2個類,Child和它繼承的類,Parent。在父類上調用靜態方法時,父類是否可以推導子類(C#)上的類型?

class Parent 
{ 
    public static void MyFunction(){} 
} 

class Child : Parent 
{ 
} 

是否有可能在父類中確定如何調用該方法?因爲我們可以把它叫做兩種方式:

Parent.MyFunction(); 
Child.MyFunction(); 

我目前的做法是試圖用:

MethodInfo.GetCurrentMethod().ReflectedType; // and 
MethodInfo.GetCurrentMethod().DeclaringType; 

但似乎都返回父類型。

如果你想知道我到底想要完成什麼(以及爲什麼我違反了基本的OOP規則,父母不應該知道關於孩子的任何內容),那麼這就是(讓我知道你是否想要長版本):

我有一個模型結構,代表我們保留到數據庫的一些數據。所有這些模型都從一個抽象的Parent繼承。這個父節點實現了一些事件,比如SaveEvent,DeleteEvent等。我們希望能夠訂閱特定於該類型的事件。因此,即使該事件是在父,我希望能夠做到:

Child.SaveEvent += new EventHandler((sender, args) => {}); 

我在的地方,該事件實際上是由事件處理程序的字典,按類型散列支持一切。我需要做的最後一件事是在做Child.SaveEvent時正確檢測Child類型。

我知道我可以在每個子類中實現事件(甚至通過使用抽象來強制它),但將它全部保存在父類中會很好,這是實際觸發事件的類(因爲它實現常用的保存/刪除/更改功能)。

回答

5

否 - 撥打Child.MyFunction()導致IL直接撥打Parent.MyFunction()。生成的二進制文件基本上不可區分。

+0

不錯。哦,C#事件的大師,是否有任何技巧使用EventHandler Event {add {} remove {}}方法來完成類型化事件? – Matt 2010-05-25 15:36:36

0

我需要做的最後一件事是在做Child.SaveEvent時正確檢測到Child類型。

您可以使用泛型基類或使該泛型方法。

+0

我認爲是通用的基類方法。但是,似乎......過分地通過並且將這個事件實現中的所有繼承結構進行了genricify。 – Matt 2010-05-25 15:39:01

+0

順便說一句,我聽到通過聲稱商標的單詞genericfy! ;)如果只有我沒有拼錯我的第一次使用它。 – Matt 2010-05-25 15:48:35

0

我不認爲這是可能的,原因很簡單,Child.SaveEvent並不存在SaveEvent僅在Parent中聲明,但編譯器允許您將其稱爲Child.SaveEvent

要做你需要做的事情,你真的不應該使用靜態方法。您可以輕鬆定義一個非常靜態的SaveEvent,其行爲完全按照需要進行。如果你確實需要一個靜態包裝器,你可以使用一個單例。

0

我根本不知道代碼,但我質疑在這種情況下使用靜態方法的智慧。也許你需要一個單獨的「經理」類,它是一個單身人士,它負責所有模型對象的事件以及其他協調任務。

相關問題