//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//  
using System;

namespace DelegatesAndEvents
{
	delegate void DelegateCallback();
	class DelegateRemoval
	{
		static void ACallback()
		{
			Console.WriteLine("ACallback()");
		}
		static void BCallback()
		{
			Console.WriteLine("BCallback()");
		}
		static void CCallback()
		{
			Console.WriteLine("CCallback()");
		}
		static void Main(string[] args)
		{
			DelegateCallback ad = new DelegateCallback(ACallback);
			DelegateCallback bd = new DelegateCallback(BCallback);
			DelegateCallback cd = new DelegateCallback(CCallback);

			DelegateCallback dd = ad;
			dd += bd;
			dd += cd;

			DelegateCallback ed = dd;

			Console.WriteLine("Oryginalna lista");
			Delegate [] da = dd.GetInvocationList();
			foreach(Delegate d in da)
			{
				Console.WriteLine("{0} {1}", d.Target, d.Method);
			}
			Console.WriteLine("Skopiowana lista");
			da = ed.GetInvocationList();
			foreach(Delegate d in da)
			{
				Console.WriteLine("{0} {1}", d.Target, d.Method);
			}

			dd = (DelegateCallback)Delegate.Remove(dd, cd);
			da = dd.GetInvocationList();
			Console.WriteLine("Oryginalna lista (po wywołaniu Remove)");
			foreach(Delegate d in da)
			{
				Console.WriteLine("{0} {1}", d.Target, d.Method);
			}
			da = ed.GetInvocationList();
			Console.WriteLine("Skopiowana lista");
			foreach(Delegate d in da)
			{
				Console.WriteLine("{0} {1}", d.Target, d.Method);
			}

		}
	}
}