using System; public delegate void MyEventHandler(Object sender, TEventArgs e) where TEventArgs : EventArgs; public class MyEventArgs : EventArgs { public string Message { get; private set; } public MyEventArgs(string message) { Message = message; } } public class Foo { public event MyEventHandler Greetings; protected virtual void OnGreetings(MyEventArgs e) { Greetings?.Invoke(this, e); } public void Greet(string message) { OnGreetings(new MyEventArgs(message)); } } public class Sample { public static void Main() { var foo = new Foo(); foo.Greetings += Greet; foo.Greet("Hello World!"); } private static void Greet(Object sender, MyEventArgs e) { Console.WriteLine(e.Message); } }