如何向MessageBox添加扩展方法?

9

这可行吗?

根据其他的例子,比如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个回答

10

描述

你无法这样做,因为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();

是的,扩展方法不能在静态范围内定义,所以我给你点赞! - Dr. Andrew Burnett-Thompson
2
你的1up在哪里?哈哈,只是开玩笑。 - dknaack
1
未能正常工作:错误 1 类型 “'System.Windows.Forms.MessageBox' 没有定义构造函数”。 - Jack
然后,这是不可能的... :( 我会接受你的答案。非常感谢! - Jack
@dknaack,抱歉网络不稳定。现在+1;-) - Dr. Andrew Burnett-Thompson
如果我可以的话,真是个噩梦! - user755404

4
你的扩展方法声明中缺少this关键字
但是,由于System.Windows.Forms.MessageBox没有公共构造函数,只有静态工厂方法(返回DialogResult),因此你无法创建独立的MessageBox实例来调用扩展方法。
所以,回答你的问题:
是的,可以在MessageBox上创建扩展方法(参见其他答案),但是你不能通过MessageBox.Foo()来调用它,你需要一个MessageBox实例,但你无法创建它,因此不起作用。

2
你需要向扩展方法添加一个类型为MessageBox的参数:
public static void Foo(this MessageBox messageBox) { ... }

然后在调用方法之前创建一个 MessageBox 实例。
var messageBox = new MessageBox();
messageBox.Foo();
< p >【更新:不幸的是,MessageBox没有公共构造函数,因此这种方法不起作用。感谢nemesv的提示。下面的例子在理论上应该有效,但实际上并不会。我将保留它作为参考。】

在你的示例中,你在类本身上调用了该方法。扩展方法只适用于实例。下面是已应用上述更正的代码版本:

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

using MessageBoxExtensions;
// ... 
var messageBox = new MessageBox();
messageBox.Foo();

2
你所写的是正确的,但是 System.Windows.Forms.MessageBox 没有公共构造函数,因此它不会起作用。 - nemesv
1
是的,谢谢你的提示。有时我想知道微软在创建Winforms之前是否考虑过面向对象的原则... - Dennis Traub

0

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

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

        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接