using System.Collections.Generic;
public static void Main()
HandlerRegistry.Register<Message1, Message1Handler>();
HandlerRegistry.Register<Message2, Message2Handler>();
var messages = new List<MessageBase>()
foreach (var message in messages)
var handler = HandlerRegistry.Resolve(message);
handler.Execute(message);
public abstract class MessageBase
public virtual void Action()
Console.WriteLine(GetType().Name);
public interface IMessageHandler
void Execute<T>(T message) where T : MessageBase;
public static class HandlerRegistry
private static readonly Dictionary<string, Type> Handlers =
new Dictionary<string, Type>();
public static void Register<T, T2>() where T2 : IMessageHandler
Handlers.Add(typeof(T).FullName, typeof(T2));
public static IMessageHandler Resolve<T>(T parameters)
var type = Handlers[parameters.GetType().FullName];
return (IMessageHandler)Activator.CreateInstance(type);
public class Message1 : MessageBase
public class Message2 : MessageBase
public override void Action()
Console.Write(@"Overriding ");
public class Message1Handler : IMessageHandler
public void Execute<T>(T message) where T : MessageBase
Console.Write(@"MessageHandler1 > ");
public class Message2Handler : IMessageHandler
public void Execute<T>(T message) where T : MessageBase
Console.Write(@"MessageHandler2 > ");
Console.WriteLine(@"...and then some");