2012-02-05 49 views
10
public class BusinessObjects<O> 
    where O : BusinessObject 
{ 
    void SomeMethod() 
    { 
     var s = O.MyStaticMethod(); // <- How to do this? 
    } 
} 

public class BusinessObject 
{ 
    public static string MyStaticMethod() 
    { 
     return "blah"; 
    } 
} 

是否存在正確的面向對象的方法來完成此操作,還是需要進行反射?如何訪問通用類型的靜態方法

編輯:我試圖過分簡化這個問題而忽略了一個重要的觀點。 MyStaticMethod使用反射並需要派生類型來返回正確的結果。但是,我剛剛意識到我的設計中存在另一個缺陷,那就是我無法使用靜態虛擬方法,我認爲這是我所需要的。

看起來我需要找到另一種解決這個問題的方法。

+0

在這裏尋找更多的信息:http://stackoverflow.com/q/196661/114029 – 2012-02-05 02:55:19

+0

我認爲這是一個很好的問題。目前它不能在C#中完成。但是這對微軟來說很有用.Net 5+ – MarzSocks 2016-07-14 16:31:29

回答

2

的原因,你不能引用靜態成員是這樣的:

O.MyStaticMethod(); 

是因爲你不知道O是什麼類型。是的,它從BusinessObject繼承,但靜態成員不在類型之間繼承,所以只能從BusinessObject引用MyStaticMethod。

+0

@DanielHilgarth刪除了錯誤的示例。儘管編譯器允許你通過派生類來調用靜態方法,但靜態成員並不是繼承的。生成的IL實際上將調用基類中的方法。再次,雖然編譯器允許它,但從派生類型引用靜態方法是不好的形式,可能會導致混淆,特別是在使用創建模式時。 – roken 2013-05-02 15:18:44

+0

當你說編譯器會將'Foo.MyStaticMethod()'改爲'BusinessObject.MyStaticMethod()'時,你的評論是正確的。但是,這並不能讓你的答案正確。這僅僅是不正確的,你只能從BusinessObject中引用(你是指「call」?)'MyStaticMethod'。 – 2013-05-02 15:21:18

+0

O是泛型類型參數。正如我們已經同意的那樣,類型之間不存在靜態方法的繼承,因此您不能期望能夠在此上下文中從BusinessObject派生的某種類型O上調用此方法。編譯器團隊可能在這裏提供了一些魔法,就像他們在顯式類型名稱中所做的那樣,但是[很慶幸]他們沒有。我會同意我的回答不盡如人意,但我仍然不會說錯。 – roken 2013-05-02 15:33:37

12

即使限制爲某個類型,也不能通過泛型類型參數訪問靜態方法。只需使用限制類直接

var s = BusinessObject.MyStaticMethod(); 

注意:如果你正在尋找調用基於實例化的類型的O這是不可能不反映靜態方法。 .Net中的泛型靜態綁定到編譯時的方法(不像說C++,它在實例化時綁定)。由於沒有辦法靜態地綁定到實例化類型的靜態方法,所以這是不可能的。虛擬方法有點不同,因爲您可以靜態綁定到虛擬方法,然後讓動態調度在實例化類型上調用正確的方法。

+0

猜測我沒有提供足夠的信息。立即檢查一個更新的問題... – 2012-02-05 02:53:25

+0

@BrandonMoore更新我的答案有點更詳細的限制 – JaredPar 2012-02-05 02:56:31

+0

是的,因爲我不能有一種虛擬的靜態方法,有點殺死我的方法。我認爲反思將是一條走向。 – 2012-02-05 03:04:40

2

如果你正迫使OBusinessObject繼承,爲什麼不這樣稱呼它:

void SomeMethod() 
{ 
    var s = BusinessObject.MyStaticMethod(); // <- How to do this? 
} 
+0

查看更新問題 – 2012-02-05 03:03:33

相關問題