我正在寻求覆盖System.Windows.Forms.MessageBox.Show()
方法来保存修改单片代码库以使用新的消息框功能。
我正在使用Citrix Mobility SDK来检测传统的C#Windows应用程序,以便在iPad或Nexus平板电脑等移动设备上实现更直观的功能。
我希望在设备上显示本地消息框,为此,我需要使用MessageBox.Show
函数替换应用程序中CustomMessageBox.Show
的所有调用。代码库是巨大的,我宁愿不修改每个文件以使用CustomMessageBox.Show
,因为这将是一个大而危险的工作,并导致SDK和应用程序之间的紧密耦合。
因此,有没有办法覆盖MessageBox.Show
,以便我可以重新实现与第三方SDK一起使用的功能,因为它是最优雅的选项?
答案 0 :(得分:2)
不,您无法覆盖MessageBox.Show
,因为它是static
方法。
答案 1 :(得分:2)
鉴于您无法覆盖MessageBox.Show
,仍然有一个解决方案可以让它适用于移动和非移动案例。最简单的方法是创建一个具有模仿MessageBox.Show
允许的成员的类。在此课程中,它了解移动设备是否处于活动状态。如果它不活动,则使用MessageBox.Show
。否则它使用CustomMessageBox.Show
。这是我在最近的一个示例中用于错误消息的示例成员函数。
/// <summary>
/// Show a error dialog box
/// </summary>
/// <param name="errorDialogText"></param>
public void ShowErrorDialog(String errorDialogText)
{
if (!Visible || !IsMobile())
{
ErrorDialog.Show(errorDialogText);
}
else
{
ShowStatus(errorDialogText);
}
}
ErrorDialog
是MessageBox的包装类。请注意IsMobile()
知道移动设备是否存在。
public class ErrorDialog
{
//
// When an exception happens, we show the message here
//
public static void Show(String text)
{
MessageBox.Show(text, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
//
// When an exception happens, we show the message here
//
public static void Show(Exception ex)
{
MessageBox.Show(ex.GetType().ToString() + ":" + ex.Message + ex.Source, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show(ex.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这只是抽象。通过创建新函数,您可以包装其他两个函数。在包装函数中,您可以决定调用哪一个。您仍然会更新所有MessageBox.Show
引用的痛苦,但至少它将在您的控制之下,您可以在将来的任何时候出于任何原因更改抽象函数。
我的例子与你描述的完全不符。您可以在派生的Form类中创建函数,也可以创建一个对象并从该对象调用该函数。
我在Citrix的SDK上工作,很乐意提供帮助。 http://citrixblogger.org上有一些新帖子可能有助于解决其他问题。