public abstract class V1AbstractEvent
new V1Manager().Handle(this);
public class V1ConcreteEvent : V1AbstractEvent {}
public void Handle<TEvent>(TEvent evt)
where TEvent : V1AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V1Writer();
public void Write(V1AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V1ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V2AbstractEvent
new V2Manager().Handle(this);
public class V2ConcreteEvent : V2AbstractEvent {}
public void Handle(V2AbstractEvent evt)
Console.WriteLine("evt type: " + evt.GetType());
dynamic writer = new V2Writer();
public void Write(V2AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V2ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V3AbstractEvent
this.TriggerInternal(new V3Manager());
protected abstract void TriggerInternal(V3Manager manager);
public class V3ConcreteEvent : V3AbstractEvent
protected override void TriggerInternal(V3Manager manager)
public void Handle<TEvent>(TEvent evt)
where TEvent : V3AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V3Writer();
public void Write(V3AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V3ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V4AbstractEvent
new V4Manager().Handle(this);
public class V4ConcreteEvent : V4AbstractEvent {}
public void Handle<TEvent>(TEvent evt)
where TEvent : V4AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V4Writer();
writer.Write((dynamic)evt);
public void Write(V4AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V4ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V5AbstractEvent
var manager = new V5Manager();
var method = typeof(V5Manager).GetMethod("Handle");
var genericMethod = method.MakeGenericMethod(this.GetType());
genericMethod.Invoke(manager, new[] { this });
public class V5ConcreteEvent : V5AbstractEvent {}
public void Handle<TEvent>(TEvent evt)
where TEvent : V5AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V5Writer();
public void Write(V5AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V5ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V6AbstractEvent
public void Trigger<TEvent>()
where TEvent : V6AbstractEvent
if (typeof(TEvent) != this.GetType())
throw new ArgumentException("Wrong type");
new V6Manager().Handle<TEvent>((TEvent)this);
public class V6ConcreteEvent : V6AbstractEvent {}
public void Handle<TEvent>(TEvent evt)
where TEvent : V6AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V6Writer();
public void Write(V6AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V6ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public abstract class V7AbstractEvent
new V7Manager().Handle((dynamic)this);
public class V7ConcreteEvent : V7AbstractEvent {}
public void Handle<TEvent>(TEvent evt)
where TEvent : V7AbstractEvent
Console.WriteLine("TEvent type: " + typeof(TEvent));
dynamic writer = new V7Writer();
public void Write(V7AbstractEvent evt)
Console.WriteLine("AbstractEvent");
public void Write(V7ConcreteEvent evt)
Console.WriteLine("ConcreteEvent");
public static void Main()
new V1ConcreteEvent().Trigger();
new V2ConcreteEvent().Trigger();
new V3ConcreteEvent().Trigger();
new V4ConcreteEvent().Trigger();
new V5ConcreteEvent().Trigger();
new V6ConcreteEvent().Trigger<V6ConcreteEvent>();
new V7ConcreteEvent().Trigger();