2010-11-02 68 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

这是因为扩展方法只能在实例而不是上调用。它们只是静态方法的语法糖。