为枚举值创建隐式转换

时间:2017-03-28 14:50:00

标签: c# wpf enums

我用自己的枚举MessageBoxButton:

创建了自己的MessageBox
public enum MyMessageBoxButton
{
    OK = MessageBoxButton.OK,
    OKCancel = MessageBoxButton.OKCancel,
    YesNoCancel = MessageBoxButton.YesNoCancel,
    YesNo = MessageBoxButton.YesNo,
    NowLaterCancel = 5,
}

正如您所看到的,它就像System.Windows.MessageBoxButton,其值更多。

对于我的MyMessageBox类,我有函数:

public static MessageBoxResult Show(String caption, String message, MyMessageBoxButton button, MessageBoxImage icon)
{
    ...
}

有没有办法用Show来调用MessageBoxButton并隐式地将值转换为MyMessageBoxButton

2 个答案:

答案 0 :(得分:1)

您可以创建一个转换器方法,将MessageBoxButtons转换为MyMessageBoxButton,创建一个Show方法的重载,该方法需要MessageBoxButtons,然后在该方法中您可以进行转换并调用现有的Show方法。

由于您没有为所有项目(例如AbortRetryIgnore)设置匹配的枚举值,因此如果有人选择其中一项,您必须决定显示哪个按钮组合:

public static MyMessageBoxButton ConvertToMyMessageBoxButton(MessageBoxButtons input)
{
    MyMessageBoxButton result;

    switch (input)
    {
        case MessageBoxButtons.OK:
            result = MyMessageBoxButton.OK;
            break;
        case MessageBoxButtons.OKCancel:
            result = MyMessageBoxButton.OKCancel;
            break;
        case MessageBoxButtons.RetryCancel:
            result = MyMessageBoxButton.NowLaterCancel;
            break;
        case MessageBoxButtons.YesNo:
            result = MyMessageBoxButton.YesNo;
            break;
        case MessageBoxButtons.YesNoCancel:
            result = MyMessageBoxButton.YesNoCancel;
            break;
        default:
            // AbortRetryIgnore will fall through to this
            result = MyMessageBoxButton.OKCancel;
            break;
    }

    return result;
}

然后,您会在Convert方法的重载中使用Show方法进行转换并调用原始Show

public static MessageBoxResult Show(String caption, String message, 
    MessageBoxButtons button, MessageBoxImage icon)
{
    return Show(caption, message, ConvertToMyMessageBoxButton(button), icon);
}

答案 1 :(得分:0)

您可以为Show()创建一个带MessageBoxButton的重载并对其进行强制转换:

public static MessageBoxResult Show(String caption, String message, MessageBoxButton button, MessageBoxImage icon)
{
    return Show(caption, message, (MyMessageBoxButton)(int)button, icon);
}

不确定第一次投射到int是否必要。不用先试试吧。

请注意,这取决于要匹配的两个枚举的值。例如,MessageBoxButton.YesNoCancel必须为3,就像MyMessageBoxButton一样。