作为参数传递时如何触发枚举的 属性 的 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;
我确实阅读了以下文档:
- https://msdn.microsoft.com/en-us/library/sbbt4032.aspx
- https://msdn.microsoft.com/en-us/library/cc138362.aspx
但是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 );
假设您有一个 属性 和一个私有字段:
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;
我确实阅读了以下文档:
- https://msdn.microsoft.com/en-us/library/sbbt4032.aspx
- https://msdn.microsoft.com/en-us/library/cc138362.aspx
但是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 );