我正在尝试找到创建系统的最佳方法,在该系统中可以将事件源添加到管理器类中,然后将它们的事件重新分配给侦听器。具体来说,我有许多不同的输入源(键盘输入源、鼠标输入源、虚拟键盘输入源等),我希望开发人员能够监听键盘输入源和输入端的 KeyDown 事件manager 本身(从任何活动输入源中捕获此事件)。
暴力破解解决方案很容易,我最终创建了许多“调度”函数,当它们通过时简单地重新调度事件,但我最终有几十个单行函数,每当有新函数时我都必须创建新函数事件被添加到输入源接口。
我考虑过使用 lambda,但如果从管理器中删除了输入源,我需要一种方法来解开事件。我可以将 lambda 保存在字典中,由输入源键入,但是许多事件具有不同的 arg 类,并且为此创建多个字典开始变得丑陋。
我想知道我是否错过了一些简单的方法来保持清洁并保持我需要写下的额外代码量。
作为参考,这是我正在使用的对象的示例:
public interface IInputSource {}
public interface IKeyboardInputSource : IInputSource
{
event EventHandler<KeyboardEventArgs> KeyDown;
event EventHandler<KeyboardEventArgs> KeyUp;
}
public interface IMouseInputSource : IInputSource
{
event EventHandler<MouseEventArgs> MouseDown;
event EventHandler<MouseEventArgs> MouseUp;
}
public class InputManager : IKeyboardInputSource, IMouseInputSource
{
private List<IInputSource> InputSources;
//Event declarations from IKeyboardInputSource and IMouseInputSource
public void AddSource(IInputSource source)
{
InputSources.Add(source);
if (source is IKeyboardInputSource)
{
var keyboardSource = source as IKeyboardInputSource;
keyboardSource.KeyDown += SendKeyDown;
// Listen for other keyboard events...
}
if (source is IMouseInputSource)
{
// Listen for mouse events...
}
}
public void RemoveSource(IInputSource source)
{
if (source is IKeyboardInputSource)
{
var keyboardSource = source as IKeyboardInputSource;
keyboardSource.KeyDown -= SendKeyDown;
// Remove other keyboard events...
}
if (source is IMouseInputSource)
{
// Remove mouse events...
}
InputSources.Remove(source);
}
private void SendKeyDown(object sender, KeyboardEventArgs e)
{
if (KeyDown != null)
KeyDown(sender, e);
}
//Other "send" functions
}