/// <summary> /// Вызвать все методы в полученной цепочке делегатов /// </summary> /// <param name="delagateChain">Цепочка делегатов</param> /// <param name="invokeParametr">Параметр для вызова</param> /// <param name="setSomeAsNull">Параметр для "обнуления" одного из делегатов в цепочке</param> public void GetAllmethodsInChain(TestDelagate delagateChain, int invokeParametr, bool setSomeAsNull = false) { if (delagateChain == null) { return; } var delegateArray = delagateChain.GetInvocationList(); if (setSomeAsNull) { delegateArray[delegateArray.Length / 2] = null; } foreach (var del in delegateArray) { try { Console.WriteLine($"\nПопытка вызвать метод {del.Method}.....\n"); ((TestDelagate)del).Invoke(invokeParametr); } catch (Exception ex) { Console.WriteLine($"В {del.Method.Name} класса {del.GetType().Name} Возникло исключение {ex.Message}"); } } }
/// <summary> /// Искусственный метод создающий цепочку делегатов и помещающий ее в поле /// TestDelagateField экземпляра класса /// </summary> public void SetTestDelegateAsChain() { TestDelagate testDelagate = null; var testDelegateExemp = new TestDelegateMethodClass(); //добавление в цепочку с помощью Delegate.Combine testDelagate = (TestDelagate)Delegate.Combine(testDelagate, new TestDelagate(TestDelegateMethodClass.Display)); testDelagate += new TestDelagate(testDelegateExemp.ShowMessage); testDelagate += new TestDelagate(testDelegateExemp.GetExceptionIfValue0); testDelagate += new TestDelagate(val => Console.WriteLine($"Анонимный метод { val }")); testDelagate += new TestDelagate(testDelegateExemp.RepeatShowMessage); TestDelagateField = testDelagate; //testDelagate.Invoke(val); }