using System;using System.Collections;using System.Reflection;//Delegatedelegate void UpdateDelegate();//Subjectclass Subject...{ public event UpdateDelegate UpdateHandler; // Methods public void Attach(UpdateDelegate ud) ...{ UpdateHandler += ud; } public void Detach(UpdateDelegate ud) ...{ UpdateHandler -= ud; } public void Notify() ...{ Console.WriteLine("-------------------------"); if (UpdateHandler != null) UpdateHandler(); Console.WriteLine("-------------------------"); }}// "ConcreteObserver"class Observer...{ // Methods public static void Show() ...{ Console.WriteLine("Observer got an Notification!"); }}class AnotherObserver...{ // Methods public static void Show() ...{ Console.WriteLine("AnotherObserver got an Notification!"); }}class Instantce...{ public void Show() ...{ Console.WriteLine("Instantce got an Notification!"); }}public class Client...{ public static void Main(string[] args) ...{ Subject a = new Subject(); a.UpdateHandler += new UpdateDelegate(Observer.Show); a.UpdateHandler += new UpdateDelegate(AnotherObserver.Show); a.UpdateHandler += new UpdateDelegate(AnotherObserver.Show); Instantce ins = new Instantce(); a.UpdateHandler += new UpdateDelegate(ins.Show); Type t = a.GetType(); FieldInfo eventsPropertyInfo = t.GetField("UpdateHandler", BindingFlags.Instance | BindingFlags.NonPublic); UpdateDelegate eventHanlderList = eventsPropertyInfo.GetValue(a) as UpdateDelegate; Delegate[] dl = eventHanlderList.GetInvocationList(); foreach (Delegate d in dl) ...{ // look up the contents in Delegate Console.WriteLine(d.Method.DeclaringType.ToString() + "." + d.Method.Name); // Detach event handler a.Detach((UpdateDelegate)d); } a.Notify(); }}