Как добавить метод расширения в MessageBox - PullRequest
9 голосов
/ 31 декабря 2011

это возможно?

на основе чужих примеров, таких как LabelExtesios, StringExtensions и т. Д. Я написал это:

namespace MessageBoxExtensions
{

    public static class MessageBoxExtensionsClass
    {
        public static void Foo()
        {

        }
    }
}

затем:

using MessageBoxExtensions;
// ... 

MessageBox.Foo();

джиношибка: MessageBox.Foo ();

'System.Windows.Forms.MessageBox' does not contain a definition for 'Foo'

Ответы [ 4 ]

8 голосов
/ 31 декабря 2011

Описание

Вы не можете сделать это, потому что System.Windows.Forms.MessageBox является НЕ экземпляром MessageBox. MessageBox.Show() - статический метод.

Вы не можете создать экземпляр MessageBox, так как у этого класса нет открытого конструктора.

Обновление

Но вы можете создать свой собственный класс в пространстве имен System.Windows.Forms и использовать MessageBox в этом методе вот так

Пример

namespace System.Windows.Forms
{
    public static class MyCustomMessageBox
    {
        public static void Foo()
        {
            MessageBox.Show("MyText");
        }
    }
}

MyCustomMessageBox.Foo();
4 голосов
/ 31 декабря 2011

Вам не хватает этого ключевого слова в объявлении метода расширения.
Но поскольку System.Windows.Forms.MessageBox не имеет общедоступного конструктора, только статические фабричные методы (которые возвращают DialogResult), поэтому вы не сможете создать автономный экземпляр MessageBox, чтобы вызывать для него метод расширения.

Итак, чтобы ответить на ваш вопрос:
Да, можно создать метод расширения на MessageBox (см. Другие ответы), но вы не можете вызвать его с помощью MessageBox.Foo(), вам нужен экземпляр MessageBox, который вы не можете создать, чтобы он не работал.

2 голосов
/ 31 декабря 2011

Вам необходимо добавить параметр типа MessageBox в метод расширения:

public static void Foo(this MessageBox messageBox) { ... }

Затем создать экземпляр MessageBox перед вызовом метода

var messageBox = new MessageBox();
messageBox.Foo();

[Обновление: К сожалению, это не работает в случае MessageBox, так как нет открытого конструктора.Спасибо nemesv за подсказку.Следующий пример теоретически должен работать, но на практике это не так.Я оставлю это для справки.]

В вашем примере вы вызываете метод для самого класса.Методы расширения применяются только к экземплярам.Вот версия вашего кода с примененными выше исправлениями:

namespace MessageBoxExtensions
{
    public static class MessageBoxExtensionsClass
    {
        public static void Foo(this MessageBox messageBox)
        {
            // ...
        }
    }
}

using MessageBoxExtensions;
// ... 
var messageBox = new MessageBox();
messageBox.Foo();
0 голосов
/ 31 декабря 2011

Необходимо указать параметр метода расширения с модификатором this, чтобы он был зарегистрирован в качестве метода расширения.

namespace MessageBoxExtensions
{
    public static class MessageBoxExtensionsClass
    {
        public static void Foo(this MessageBox messagebox)
        {

        }
    }
}
...