/// <summary> /// Пример цепочки делегатов /// </summary> public static void Question1() { var testClass = new TestDelegateMethodClass(); testClass.SetTestDelegateAsChain(); testClass.TestDelagateField.Invoke(3); }
/// <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); }
/// <summary> /// Пример обработки исключения, которое может случиться в цепочке делегатов. /// </summary> public static void Question2() { var testClass = new TestDelegateMethodClass(); //метод просто формаирует цепочку делегатов testClass.SetTestDelegateAsChain(); // метод вызова цепочки делегатов с обработкой возможных ошибок, последний параметр // указвает нужно ли присвоить одному из методов цепочке null // при вызове с таким пораметром вызовет необрабатываемое исключение // testClass.GetAllmethodsInChain(testClass.TestDelagateField, 0, true); // при таком вызове все нормально, ошибка "запланирована" в методе делящем на передаваемый параметр testClass.GetAllmethodsInChain(testClass.TestDelagateField, 0); //testClass.TestDelagateField.Invoke(0); }
/// <summary> /// Пример обобщенного делегата(Action, Func) /// </summary> public static void Question3() { var testClass = new TestDelegateMethodClass(); //пример инициализации и использования обобщенного экшн делегата var actionDelegate = new Action <int>(testClass.ShowMessage); //добавили метод удовлетворяющий сигнатуре actionDelegate += new Action <int>(TestDelegateMethodClass.Display); var functDelegate = new Func <int, string>(testClass.ForFuncDelegateMethod1); //не указываем тип создваемого объекта, Передаем метод принимающий int возвращающий object //следующая строка выдаст ошибку на этапе компиляции //functDelegate += new(testClass.ForFuncDelegateMethod2); //вызвываем метод делегата(цепочку методов) Console.WriteLine(functDelegate.Invoke(2)); }