• Source
    1. using System;
    2. using System.Reflection;
    3.  
    4. public delegate void ProgramMethodDelegate();
    5. public delegate void DelegateMethod();
    6.  
    7. public class Test
    8. {
    9. public static void Main()
    10. {
    11. BaseClass bc = new BaseClass();
    12. Console.WriteLine("EventInfo");
    13. EventInfo eInfo = bc.GetType().GetEvent("FieldChanged");
    14. //Console.WriteLine(eInfo.AddMethod.Name);
    15. // add_FieldChanged
    16. //Console.WriteLine(eInfo.RemoveMethod.Name);
    17. // remove_FieldChanged
    18. Console.WriteLine(eInfo.DeclaringType);
    19. // BaseClass
    20. Console.WriteLine(eInfo.EventHandlerType);
    21. // DelegateMethod
    22. Console.WriteLine(eInfo.IsMulticast);
    23. // True
    24. Console.WriteLine(eInfo.IsSpecialName);
    25. // False
    26. Console.WriteLine(eInfo.MemberType);
    27. // Event
    28. Console.WriteLine(eInfo.MetadataToken);
    29. // 335544322
    30. //Console.WriteLine(eInfo.RaiseMethod);
    31. //NULL : This is because the C# and Visual Basic compilers do not generate such a method by default.
    32. Console.WriteLine(eInfo.ReflectedType);
    33. // BaseClass
    34. //Console.WriteLine("Other methods:" + eInfo.GetOtherMethods().Length);
    35. // 0
    36. ProgramMethodDelegate pdelg = new ProgramMethodDelegate(delegate { Console.WriteLine("new delegate"); });
    37. DelegateMethod delg = new DelegateMethod(pdelg);
    38. eInfo.AddEventHandler(bc, delg);
    39. bc.OnChanged();
    40. // Field value was changed to Hello from BaseClass!!
    41. // Method 1 was invoked in BaseClass
    42. // new delegate
    43.  
    44. }
    45. }
    46.  
    47. public class BaseClass
    48. {
    49. public event DelegateMethod fieldChanged;
    50. public event DelegateMethod FieldChanged
    51. {
    52. add {
    53. fieldChanged += value;
    54. }
    55. remove
    56. {
    57. fieldChanged -= value;
    58. }
    59. }
    60.  
    61. public string Field
    62. {
    63. get;
    64. protected set;
    65. }
    66.  
    67. public BaseClass()
    68. {
    69. Field = "!@$$";
    70. SayHello();
    71. }
    72.  
    73. public virtual void SayHello()
    74. {
    75. Console.WriteLine("Hello from BaseClass!");
    76. Field = "Hello from BaseClass!";
    77. FieldChanged += delegate { Console.WriteLine("Field value was changed to " + Field + "!"); };
    78. FieldChanged += Method1;
    79. //FieldChanged -= Method1;
    80. }
    81.  
    82. protected void Method1()
    83. {
    84. Console.WriteLine("Method 1 was invoked in BaseClass");
    85. }
    86.  
    87. public void OnChanged()
    88. {
    89. fieldChanged();
    90. }
    91. }