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;
}
{
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();
}
}