如果您真的想概括这一点(并且可能这样做,以便您可以响应从响应更改的类外部对 ToolMode 所做的更改),您可以以正常方式使用事件。
您可以将当前 ToolMode 封装在一个类中,并向该类添加一个在 ToolMode 更改时将引发的事件。例如:
public sealed class CurrentToolMode
{
public ToolMode CurrentMode { get; private set; }
public event EventHandler ModeChanged;
public void ChangeMode(ToolMode newMode)
{
if (newMode == CurrentMode)
return;
CurrentMode = newMode;
ModeChanged?.Invoke(this, EventArgs.Empty);
}
}
然后像这样使用它:
public sealed class Test
{
public Test(CurrentToolMode mode)
{
_mode = mode;
_mode.ModeChanged += onModeChanged;
}
void onModeChanged(object sender, EventArgs e)
{
UpdateUI();
}
void UpdateUI()
{
Console.WriteLine("UpdateUI() called; mode was changed to " + _mode.CurrentMode);
}
public void SetMode1()
{
_mode.ChangeMode(ToolMode.Mode1);
}
public void SetMode2()
{
_mode.ChangeMode(ToolMode.Mode2);
}
readonly CurrentToolMode _mode;
}
在上面的示例中,CurrentToolMode 被传入构造函数,以便可以从其他类修改它。或者,您可以在构造函数中创建它,这样其他任何东西都无法更改它 - 这取决于您的使用模式。
这是一个可编译的控制台应用程序,展示了它的用法:
using System;
namespace Demo
{
class Program
{
static void Main()
{
Test test = new Test(new CurrentToolMode());
test.SetMode1();
test.SetMode2();
}
}
public sealed class Test
{
public Test(CurrentToolMode mode)
{
_mode = mode;
_mode.ModeChanged += onModeChanged;
}
void onModeChanged(object sender, EventArgs e)
{
UpdateUI();
}
void UpdateUI()
{
Console.WriteLine("UpdateUI() called; mode was changed to " + _mode.CurrentMode);
}
public void SetMode1()
{
_mode.ChangeMode(ToolMode.Mode1);
}
public void SetMode2()
{
_mode.ChangeMode(ToolMode.Mode2);
}
readonly CurrentToolMode _mode;
}
public enum ToolMode
{
None,
Mode1,
Mode2
}
public sealed class CurrentToolMode
{
public ToolMode CurrentMode { get; private set; }
public event EventHandler ModeChanged;
public void ChangeMode(ToolMode newMode)
{
if (newMode == CurrentMode)
return;
CurrentMode = newMode;
ModeChanged?.Invoke(this, EventArgs.Empty);
}
}
}
该代码的输出是:
UpdateUI() called; mode was changed to Mode1
UpdateUI() called; mode was changed to Mode2
我要强调的是,如果您只打算在一个类中的有限数量的方法中使用这种解决方案,那么这种解决方案完全是矫枉过正,但它展示了一种以解耦方式响应设置更改的通用方法。这种方法允许任意数量的类响应设置更改。
这是一个可编译的示例,显示了从类外部响应模式更改而更改的模式:
using System;
namespace Demo
{
class Program
{
static void Main()
{
CurrentToolMode mode = new CurrentToolMode();
Test test = new Test(mode);
mode.ChangeMode(ToolMode.Mode1);
mode.ChangeMode(ToolMode.Mode2);
}
}
public sealed class Test
{
public Test(CurrentToolMode mode)
{
_mode = mode;
_mode.ModeChanged += onModeChanged;
}
void onModeChanged(object sender, EventArgs e)
{
UpdateUI();
}
void UpdateUI()
{
Console.WriteLine("UpdateUI() called; mode was changed to " + _mode.CurrentMode);
}
readonly CurrentToolMode _mode;
}
public enum ToolMode
{
None,
Mode1,
Mode2
}
public sealed class CurrentToolMode
{
public ToolMode CurrentMode { get; private set; }
public event EventHandler ModeChanged;
public void ChangeMode(ToolMode newMode)
{
if (newMode == CurrentMode)
return;
CurrentMode = newMode;
ModeChanged?.Invoke(this, EventArgs.Empty);
}
}
}