作为参数传递时如何触发枚举的 属性 的 setter?

How to trigger the setter of a property of an enum when passing as parameter?

假设您有一个 属性 和一个私有字段:

private MessageBoxResult doNotUseMe_Result;

public MessageBoxResult MyResult
{
    get { return doNotUseMe_Result; }
    set
    {
        doNotUseMe_Result = value;
    }
}

MessageBoxResult 是一个枚举,用于获取 MessageBox (WPF) 的结果。尽管如此,我在将 MyResult 传递给方法时遇到了问题,因为它自动使用枚举的值类型并且更改的结果正在被 GC 收集,因为它现在是一个全新的指定变量在我的方法范围内 (TaskBasedShow)...

我目前的设置:

public delegate void OnResult(MessageBoxResult res);

private MessageBoxResult doNotUseMe_Result;

public MainWindow()
{
    InitializeComponent();

    OnRes += MessageBox_OnRes;

    TaskBasedShow("My message", "My caption", MessageBoxButton.YesNo, MessageBoxImage.Question, MyResult);
}

public MessageBoxResult MyResult
{
    get { return doNotUseMe_Result; }
    set
    {
        doNotUseMe_Result = value;
        OnRes?.Invoke(value);
    }
}


public void TaskBasedShow(string message, string caption, MessageBoxButton buttons,
        MessageBoxImage image, MessageBoxResult resultprop)
{
    Task.Factory.StartNew(() => { resultprop = MessageBox.Show(message, caption, buttons, image); });
}

/// <summary>
///     Is getting triggered after the user pressed a button.
/// </summary>
/// <param name="res">The pressed button.</param>
private void MessageBox_OnRes(MessageBoxResult res)
{
    MessageBox.Show(res.ToString());
}


public event OnResult OnRes;

我确实阅读了以下文档:

但是enum好像没有提供Set(value)方法。


问题:

当设置枚举的 属性 的变量时( 在方法 中),setter 不会被触发,因此我的自定义事件.

它应该做什么:

它应该在设置 属性 时触发 OnRes,因为我的 setter 正在被触发,因此我的 OnResult 事件的订阅者。工作示例:

public MainWindow()
{
    InitializeComponent();

    OnRes += MessageBox_OnRes;

    MyResult = MessageBoxResult.Cancel;
}

它将打开另一个显示 "Cancel".

的消息框

注:

一种解决方案是在 TaskBasedShow 中使用 属性:

Task.Factory.StartNew(() => { MyResult = MessageBox.Show(message, caption, buttons, image); });

因为它现在使用引用类型而不是传递值类型。

您应该使用回调来取回结果值

public async void TaskBasedShow( 
    string message, 
    string caption, 
    MessageBoxButton buttons,
    MessageBoxImage image, 
    Action<MessageBoxResult> resultCallback)
{
    var result = await Task.Run(() => MessageBox.Show(message, caption, buttons, image ) );
    resultCallback( result );
}

并这样称呼它

TaskBasedShow(
    "My message", 
    "My caption", 
    MessageBoxButton.YesNo, 
    MessageBoxImage.Question, 
    r => MyResult = r );