using System; using System.Linq; using System.Threading; static class Extensions { public static Delegate ConvertTo(this Delegate self, Type type) { if (type == null) { throw new ArgumentNullException("type"); } if (self == null) { return null; } if (self.GetType() == type) return self; return Delegate.Combine( self.GetInvocationList() .Select(i => Delegate.CreateDelegate(type, i.Target, i.Method)) .ToArray()); } public static T ConvertTo(this Delegate self) { return (T)(object)self.ConvertTo(typeof(T)); } } public class A { } public class B : A {} public delegate void MyEventHandler(object sender, T arg); public class TheClass { public event MyEventHandler MyEvent { add { this._myEvent += value.ConvertTo>(); } remove { this._myEvent -= value.ConvertTo>(); } } private MyEventHandler _myEvent; public void RaiseEvent(B arg) { var handler = this._myEvent; if(handler != null) handler(this, arg); } } class Program { static void Main() { var obj = new TheClass(); obj.MyEvent += new MyEventHandler((sender, e) => Console.WriteLine("B handler: Hey there from {0} with {1}!", sender, e)); obj.MyEvent += new MyEventHandler((sender, e) => Console.WriteLine("A handler: Hey there from {0} with {1}!", sender, e)); obj.MyEvent += new MyEventHandler((sender, e) => Console.WriteLine("Object handler: Hey there from {0} with {1}!", sender, e)); obj.RaiseEvent(new B()); } }