2010-11-02 67 views
1

考慮這個枚舉:擴展方法 - 不能暴露在枚舉本身方法

enum State 
{ 
    On, 
    Off 
} 

...而這個擴展方法:

public static void Foo(this Enum e) 
{ 
    // Here be dragons... 
} 

如果我想打電話給美孚( ),我必須在Enum的一個屬性中調用它:State.On.Foo() ...我無法在Enum本身上調用它:State.Foo()

這是爲什麼?我需要做什麼,能夠在Enum本身上調用Foo()

回答

7

如果你試圖調用State.Foo(),這是試圖調用靜態方法上Foo。擴展方法擴展了實例的一種類型。它們就像添加實例方法到那種類型,但不能添加任何狀態。

舉一個爲什麼這不起作用的例子,你會期望這段代碼做什麼?

int count = IEnumerable<string>.Count(); 

不能假冒加入靜態方法的類型。這只是擴展方法不支持的東西。

+0

我可以在Enum.Format(),Enum.GetName()等邊添加Foo()嗎? – roosteronacid 2010-11-02 11:55:10

+0

@roosteronacid:不,這些都是靜態方法。你不能僞造向類型添加靜態方法。 – 2010-11-02 12:36:58

+0

@roosterronacid嗨,不要以爲你可以。正如Jon所說,擴展方法用於對象的實例。有關如何解決此問題的一些示例,您可以查看http://www.extensionmethod.net/Details.aspx?ID=255我不太確定這樣做會實際上給你看起來更好或更容易維護的代碼,但你可以看看代碼示例。 – Mikael 2010-11-02 12:39:13

0

這是因爲擴展方法只能在實例而不是上調用。它們只是靜態方法的語法糖。