Exemple #1
0
        /// <summary>
        /// Пример цепочки делегатов
        /// </summary>
        public static void Question1()
        {
            var testClass = new TestDelegateMethodClass();

            testClass.SetTestDelegateAsChain();
            testClass.TestDelagateField.Invoke(3);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
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));
        }