2010-11-02 3 views
1

Рассмотрим Enum:методы расширения на Enum - не в состоянии выставить методы на самом Enum

enum State 
{ 
    On, 
    Off 
} 

... И этот метод расширения:

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

Если я хочу вызвать Foo (), я должен назвать его одним из свойств Enum: State.On.Foo() ... Я не могу назвать его на самом Enum: State.Foo().

Почему это? И что мне нужно сделать, чтобы иметь возможность называть Foo() на самом Enum?

ответ

7

Если вы пытаетесь вызвать State.Foo(), что пытается вызвать метод статический на Foo. Методы расширения расширяют экземпляры типа. Они похожи на добавление методов экземпляра к этому типу, но без возможности добавления какого-либо состояния.

Чтобы привести пример, почему это не сработает, что вы ожидаете от этого кода?

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

Вы не можете поддельной добавлять статические методы к типу. Это не то, что поддерживают методы расширения.

+0

Могу ли я добавить Foo() вдоль Enum.Format(), Enum.GetName() и т. Д.? – roosteronacid

+0

@roosteronacid: Нет, это статические методы. Вы не можете подделать статические методы для типа. –

+0

@roosterronacid Привет, не думай, что можешь. Как сказал Джон, методы расширения используются для экземпляров объектов. Для некоторых примеров того, как обойти это, вы можете посмотреть, например. http://www.extensionmethod.net/Details.aspx?ID=255 Я не уверен, что это действительно даст вам код, который выглядит намного лучше или проще в обслуживании, но вы можете взглянуть на примеры кода в любом случае. – Mikael

0

Это потому, что методы расширения можно вызывать только на экземпляр, а не класс. Это просто синтаксический сахар для статических методов.

Смежные вопросы