//
// 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 CustomAttributes
{
	[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
	class HelloAttribute : Attribute
	{
		private int id;
		private string message;
		public HelloAttribute(string message)
		{
			id = 0;
			this.message = message;
			Console.WriteLine("Tworzenie Hello");
		}
		public int Id
		{
			get
			{
				return id;
			}
			set
			{
				Console.WriteLine("Ustawianie identyfikatora");
				id = value;
			}
		}
		public string Message
		{
			get
			{
				return message;
			}
		}
	}

	[Hello("Witaj świecie!")]
	[Hello("Witaj świecie, ponownie!")]
	class MyClass
	{
		public MyClass()
		{
			Console.WriteLine("Tworzenie MyClass");
			Object [] attributes = typeof(MyClass).GetCustomAttributes(true);
			foreach(Attribute attrib in attributes)
			{
				HelloAttribute ha = attrib as HelloAttribute;
				if(ha != null)
				{
					Console.WriteLine("Wiadomość: {0}", ha.Message);
				}
			}
		}
	}

	class CustomAttributesMain
	{
		static void Main(string[] args)
		{
			MyClass m = new MyClass();
		}
	}
}
