Advertisement
Guest User

Untitled

a guest
Jun 16th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. public interface IFoo<T>
  2. {
  3. event Action<T> ChangeValue;
  4. event Action<object> ChangeObject;
  5. event Action ChangeEmpty;
  6.  
  7. void InvokeChange(T value);
  8. }
  9.  
  10. IFoo<int> test = new Foo<int>();
  11. test.ChangeEmpty += () => Console.WriteLine("0) Empty!");
  12. test.ChangeObject += (o) => Console.WriteLine("1) Object: {0}", o);
  13. test.ChangeValue += (v) => Console.WriteLine("2) Value: {0}", v);
  14. test.ChangeObject += (o) => Console.WriteLine("3) Object: {0}", o);
  15. test.ChangeEmpty += () => Console.WriteLine("4) Empty!");
  16. test.InvokeChange(123);
  17.  
  18. 0) Empty!
  19. 1) Object: 123
  20. 2) Value: 123
  21. 3) Object: 123
  22. 4) Empty!
  23.  
  24. public static void Main()
  25. {
  26. IFoo<int> test = new Foo<int>();
  27.  
  28. test.ChangeEmpty += EmptyHandler;
  29. test.ChangeObject += ObjectHandler;
  30. Console.WriteLine("1) EMPTY, OBJECT");
  31. test.InvokeChange(1);
  32.  
  33. test.ChangeEmpty -= EmptyHandler;
  34. test.ChangeValue += ValueHandler;
  35. Console.WriteLine("2) OBJECT, VALUE");
  36. test.InvokeChange(2);
  37.  
  38. test.ChangeObject -= ObjectHandler;
  39. Console.WriteLine("3) VALUE ");
  40. test.InvokeChange(3);
  41.  
  42. test.ChangeObject += ObjectHandler;
  43. test.ChangeEmpty += EmptyHandler;
  44. test.ChangeValue += ValueHandler;
  45. Console.WriteLine("4) VALUE, OBJECT, EMPTY, VALUE");
  46. test.InvokeChange(4);
  47.  
  48. test.ChangeValue -= ValueHandler;
  49. test.ChangeValue -= ValueHandler;
  50. test.ChangeEmpty -= EmptyHandler;
  51. test.ChangeObject -= ObjectHandler;
  52. Console.WriteLine("5) <NONE>");
  53. test.InvokeChange(5);
  54. }
  55.  
  56. static void EmptyHandler() { Console.WriteLine(" - Empty!"); }
  57. static void ObjectHandler(object val) { Console.WriteLine(" - Object: {0}", val); }
  58. static void ValueHandler(int val) { Console.WriteLine(" - Value: {0}", val); }
  59.  
  60. 1) EMPTY, OBJECT
  61. - Empty!
  62. - Object: 1
  63. 2) OBJECT, VALUE
  64. - Object: 2
  65. - Value: 2
  66. 3) VALUE
  67. - Value: 3
  68. 4) VALUE, OBJECT, EMPTY, VALUE
  69. - Value: 4
  70. - Object: 4
  71. - Empty!
  72. - Value: 4
  73. 5) <NONE>
  74.  
  75. public event Action<T> ChangeValue = delegate {};
  76.  
  77. private Dictionary<System.Action<object>, List<System.Action<T>>> ObjectEventProxies
  78. = new Dictionary<System.Action<object>, List<System.Action<T>>>();
  79.  
  80. public event System.Action<object> ChangeObject
  81. {
  82. add
  83. {
  84. List<System.Action<T>> eventProxies;
  85. if(!ObjectEventProxies.TryGetValue(value, out eventProxies))
  86. {
  87. eventProxies = new List<System.Action<T>>();
  88. ObjectEventProxies.Add(value, eventProxies);
  89. }
  90. System.Action<T> proxy = (T v) => value.Invoke(v);
  91. eventProxies.Add(proxy);
  92. ChangeValue += proxy;
  93. }
  94. remove
  95. {
  96. List<System.Action<T>> eventProxies;
  97. if (ObjectEventProxies.TryGetValue(value, out eventProxies))
  98. {
  99. System.Action<T> proxy = eventProxies[eventProxies.Count - 1];
  100. eventProxies.RemoveAt(eventProxies.Count - 1);
  101. ChangeValue -= proxy;
  102. }
  103. }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement