using System.Collections.Generic;
public interface IMessage
public class Message : IMessage
public int Id { get; set; }
public string Name { get; set; }
private static Dictionary<Type, Action<IMessage>> subActions = new Dictionary<Type, Action<IMessage>>();
private static void Subscribe<TMessage>(Action<TMessage> action)
where TMessage : IMessage
subActions.Add(typeof(TMessage), x => action((TMessage)x));
public static void Main()
Subscribe<Message>(x => x.Name = "Test");
var probe = new Message();
subActions.First().Value(probe);
Console.WriteLine(probe.Name);