如何向MessageBox添加扩展方法

时间:2011-12-31 13:55:33

标签: c# .net extension-methods

有可能吗?

基于另一个例子,如LabelExtesios,StringExtensions等。 我写了这个:

namespace MessageBoxExtensions
{

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

        }
    }
}

然后:

using MessageBoxExtensions;
// ... 

MessageBox.Foo();

gin错误:MessageBox.Foo();

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

4 个答案:

答案 0 :(得分:8)

描述

您无法执行此操作,因为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();

答案 1 :(得分:4)

您遗漏了扩展方法声明中的this keyword 但是因为System.Windows.Forms.MessageBox没有公共构造函数只是静态工厂方法(返回DialogResult)所以你不能创建一个独立的MessageBox实例来调用你的扩展方法。

所以回答你的问题:
是的,可以在MessageBox上创建一个扩展方法(参见其他答案),但是你不能通过MessageBox.Foo()调用它,你需要一个MessageBox的实例,你不能创造它所以它赢了“工作。

答案 2 :(得分:2)

您需要在扩展方法中添加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();

答案 3 :(得分:0)

您必须使用this修饰符限定扩展方法参数,才能将其注册为扩展方法。

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

        }
    }
}