/// <summary> /// Вызывает выполнение переданного делегата с переданными значениями /// и выводит результат выполнения /// </summary> /// <param name="val1">тестируемый параметр1</param> /// <param name="val2">тестируемый параметр2</param> /// <param name="delegate">Делегат(ссылка на тестируемый метод)</param> public static void OperationResult(int?val1, int?val2, CalcMethodDelegate <int?> @delegate) { if (@delegate == null) { Console.WriteLine("Нечего вызвыать"); return; } var delegateArray = @delegate.GetInvocationList(); foreach (var del in delegateArray) { try { string n1 = val1.HasValue ? val1.ToString() : "null"; string n2 = val2.HasValue ? val2.ToString() : "null"; var res = @del.DynamicInvoke(val1, val2); res = res == null ? "null" : res; Console.WriteLine($"\nПопытка вызвать метод {del.Method.Name}.....\n"); Console.WriteLine($"Выполнена операция {@del.Method.Name}({n1}, {n2})={res}"); } catch (Exception ex) { Console.WriteLine($"В {del.Method.Name} класса {del.GetType().Name} Возникло исключение {ex.Message}"); } } }
/// <summary> /// сравнение и арфиметика с null числами (когда одно - null, второе - не null) без HasValue /// Добавлены новые методы CompareV2 и SubstructV2 логика работы а тка же ответ описаны в их "summary" /// </summary> public static void Question8() { var calculator = new NullableCalculator(); var del = new CalcMethodDelegate <int?>(calculator.CompareV2); del += new CalcMethodDelegate <int?>(calculator.SubstructV2); NullableCalculator.OperationResult(1, 2, del); NullableCalculator.OperationResult(2, 1, del); NullableCalculator.OperationResult(null, 1, del); NullableCalculator.OperationResult(1, null, del); NullableCalculator.OperationResult(null, null, del); }