using System; using System.Reflection; public delegate void ProgramMethodDelegate(); public delegate void DelegateMethod(); public class Test { public static void Main() { BaseClass bc = new BaseClass(); Console.WriteLine("EventInfo"); EventInfo eInfo = bc.GetType().GetEvent("FieldChanged"); //Console.WriteLine(eInfo.AddMethod.Name); // add_FieldChanged //Console.WriteLine(eInfo.RemoveMethod.Name); // remove_FieldChanged Console.WriteLine(eInfo.DeclaringType); // BaseClass Console.WriteLine(eInfo.EventHandlerType); // DelegateMethod Console.WriteLine(eInfo.IsMulticast); // True Console.WriteLine(eInfo.IsSpecialName); // False Console.WriteLine(eInfo.MemberType); // Event Console.WriteLine(eInfo.MetadataToken); // 335544322 //Console.WriteLine(eInfo.RaiseMethod); //NULL : This is because the C# and Visual Basic compilers do not generate such a method by default. Console.WriteLine(eInfo.ReflectedType); // BaseClass //Console.WriteLine("Other methods:" + eInfo.GetOtherMethods().Length); // 0 ProgramMethodDelegate pdelg = new ProgramMethodDelegate(delegate { Console.WriteLine("new delegate"); }); DelegateMethod delg = new DelegateMethod(pdelg); eInfo.AddEventHandler(bc, delg); bc.OnChanged(); // Field value was changed to Hello from BaseClass!! // Method 1 was invoked in BaseClass // new delegate } } public class BaseClass { public event DelegateMethod fieldChanged; public event DelegateMethod FieldChanged { add { fieldChanged += value; } remove { fieldChanged -= value; } } public string Field { get; protected set; } public BaseClass() { Field = "!@$$"; SayHello(); } public virtual void SayHello() { Console.WriteLine("Hello from BaseClass!"); Field = "Hello from BaseClass!"; FieldChanged += delegate { Console.WriteLine("Field value was changed to " + Field + "!"); }; FieldChanged += Method1; //FieldChanged -= Method1; } protected void Method1() { Console.WriteLine("Method 1 was invoked in BaseClass"); } public void OnChanged() { fieldChanged(); } }