2010-08-16 16 views
3

說我有在大會甲基類:確定一個子類的組件,帶在基類的方法

public class MyBaseClass{ 
    public static Assembly GetMyAssembly(){ 
    //determine the Assembly of my subclasses 
    } 
} 

然後我創建該類的組件B內的子類:

public class MySubClass : MyBaseClass { 
} 

從那裏,在我的領域特定的邏輯我調用MySubClass.GetMyAssembly()。此邏輯可能與MySubClass在同一個程序集中,或者它可能位於單獨的程序集中。我如何確定包含調用繼承方法的子類的程序集? (不重寫它)我試圖在System.Reflection中使用不同的Assembly.Get *()方法,但沒有任何運氣。

+2

如上所述,如果GetMyAssembly實際上是一個**靜態**方法,那麼代碼將不會在您定義它的類之外的任何程序集中執行。另外,由於它是靜態的,所以也沒有「覆蓋」。 MySubClass.GetMyAssembly()會(除非你使用「new」操作符)總是指向MyBaseClass中定義的實現。 – 2010-08-16 13:53:15

回答

1

你不能。這種靜態方法確實是確實是住在具有基本類型的程序集中。

您可以做的最好的方法是使用實​​例方法(省略static關鍵字),以便代碼可以訪問此引用的。 this.GetType()表達式爲您提供派生類型。它的Assembly屬性爲您提供包含派生類型的程序集。

+0

感謝您的回答以及您的建議,通過實例方法中的GetType()方法而不是靜態方法來檢索給定類型的子類的程序集。我希望在團隊中的其他開發人員可以使用單個靜態方法,但還有其他方法可以簡化實現。非常感謝你! – wintondeshong 2010-08-16 17:45:35

0

我建議,而不是使用Assembly.Get*()方法,你看看在Type對象本身 - 它有一些非常有用的屬性和方法:

this.GetType().BaseType.Assembly; 

如果你正在尋找簡單地得到一個特定的基類的彙編,你需要使用typeof(MyBaseClass).Assembly - 因爲你的類應該知道它的繼承鏈,我不認爲這會是一個問題。

+0

我在等待OP的一些澄清,但這聽起來像是他想要相反的解決方案。從基類的上下文中獲取所有的子類。如果是這樣的話,他將別無選擇,只能使用AppDomain.CurrentDomain.GetAssemblies()。 – 2010-08-16 13:55:05

+0

哦,好點。我想我在閱讀這個問題時可能沒有完全清醒。不過,我希望有一種類似於靜態方法的typeof(self),特別是對於可繼承類的靜態方法。這可能是wintondeshong正在尋找的。 – 2010-08-16 15:52:37

相關問題