有可能吗?
基于另一个例子,如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'
答案 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)
{
}
}
}