c# - 通用事件处理

标签 c# .net

我正在使用一些 .NET 框架,它允许注册 Action<IMessage> 的事件处理程序类型。

IMessage 是接收到的所有消息都在实现的接口(interface)。

我希望能够(以某种方式)注册知道收到的消息的具体类型的处理程序,以便更彻底地记录它。

与此类似的东西:

manager.Register(SpecialHandler);

public void SpecialHandler(SpecialMessage msg)
{
   // log.
}
  • SpecialMessage 是一种实现 IMessage 的类型。

这是不可能的,有没有简单的方法可以做到这一点?

最佳答案

// improved version of Travis Gockel's approach
void Register<T>(Action<T> action, bool invokeOnTypeMismatch = false)
    where T : IMessage
{
    Action<IMessage> wrapped = (msg) =>
        {
            if (msg is T)
            {
                action((T)msg);
            }
            else if (invokeOnTypeMismatch)
            {
                action(default(T));
            }
        };

    // private Action<IMessage> method = delegate{};
    method += wrapped;
}

关于c# - 通用事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8773886/

相关文章:

c# - 无法在 Windows XP 机器上启动 wpf 应用程序

c# - 为什么我应该偏爱 stub 而不是模拟?

c# - 内存压力会导致 ASP.NET 中的 session 数据逐出吗?

.net - 如何使用 "dotnet run"命令在分离模式下运行 dot net core 应用程序

c# - .NET 中的深度反射(reflection)

c# - 无法使用asp.net mvc上传多个数据库图像

c# - 如何对从 NetworkStream 派生的类进行单元测试?

.net - 当我将 .NET Button 的 BackColor 更改回其原始值时,它看起来不再相同

.net - Database.EnsureCreated() 不创建表

.net - 什么版本的 .NET 附带什么版本的 Windows?