private static bool ValidateUser(User2 user)
        {
            Type type = typeof(User2);

            object[] attrs = type.GetCustomAttributes(false);
            foreach (AgeValidationAttribute attr in attrs)
            {
                if (user.Age >= attr.Age && user.Age < 121)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(true);
        }
        public static void OutTask()
        {
            Console.WriteLine("---- Изучение класса System.Reflection ----\n" +
                              "1.Assembly: класс, представляющий сборку и позволяющий манипулировать этой сборкой\n" +
                              "AssemblyName: класс, хранящий информацию о сборке\n" +
                              "MemberInfo: базовый абстрактный класс, определяющий общий функционал для классов EventInfo, FieldInfo, MethodInfo и PropertyInfo\n" +
                              "EventInfo: класс, хранящий информацию о событии\n" +
                              "FieldInfo: хранит информацию об определенном поле типа\n" +
                              "MethodInfo: хранит информацию об определенном методе\n" +
                              "PropertyInfo: хранит информацию о свойстве\n" +
                              "ConstructorInfo: класс, представляющий конструктор\n" +
                              "Module: класс, позволяющий получить доступ к определенному модулю внутри сборки\n" +
                              "ParameterInfo: класс, хранящий информацию о параметре метода\n" +
                              "2.Получение членов типа System.Type:\n" +
                              "Метод FindMembers() возвращает массив объектов MemberInfo данного типа" +
                              "Метод GetConstructors() возвращает все конструкторы данного типа в виде набора объектов ConstructorInfo\n" +
                              "Метод GetEvents() возвращает все события данного типа в виде массива объектов EventInfo\n" +
                              "Метод GetFields() возвращает все поля данного типа в виде массива объектов FieldInfo\n" +
                              "Метод GetInterfaces() получает все реализуемые данным типом интерфейсы в виде массива объектов Type\n" +
                              "Метод GetMembers() - возвращает все члены типа в виде массива объектов MemberInfo\n" +
                              "Метод GetMethods() - получает все методы типа в виде массива объектов MethodInfo\n" +
                              "Метод GetProperties() - получает все свойства в виде массива объектов PropertyInfo\n" +
                              "Свойство Name - возвращает имя типа\n" +
                              "Свойство Assembly - возвращает название сборки, где определен тип\n" +
                              "Свойство Namespace - возвращает название пространства имен, где определен тип\n" +
                              "Свойство IsClass - возвращает true, если тип представляет класс\n" +
                              "Свойство IsEnum - возвращает true, если тип является перечислением\n" +
                              "Свойство IsInterface - возвращает true, если тип представляет интерфейс\n" +
                              "3.Позднее связывание и класс System.Activator\n" +
                              "4.Создание атрибутов\n" +
                              "Данный класс использует рефликсию в своих методах");

            // 1
            string   filePath = @"./ClassLibrary.dll";
            Assembly assembly = Assembly.LoadFrom(filePath);
            Type     asmType  = assembly.GetType();

            Console.WriteLine("Основная информация об экземпляре assembly");
            Console.WriteLine("-------Свойства:");
            Console.WriteLine($"Полное имя - {assembly.FullName}");
            Console.WriteLine($"Расположение - {assembly.Location}");
            Console.WriteLine($"Версия среды выполнения изображения - {assembly.ImageRuntimeVersion}");
            Console.WriteLine($"Модули - {assembly.Modules}");
            Console.WriteLine($"Информация о хосте - {assembly.HostContext}");
            Console.WriteLine("-------Методы:");
            Console.WriteLine($"Получить имя - {assembly.GetName()}");
            Console.WriteLine($"Получить массив типов - {assembly.GetTypes()}");
            Console.WriteLine($"Получить дефолтные атрибуты - {assembly.GetCustomAttributes()}");
            Console.WriteLine($"Находит тип в этой сборке и создает его экземпляр, используя абстрактный метод - {assembly.CreateInstance("Phone")}");
            Console.WriteLine($"Возвращает объект FileStream для указанного файла из таблицы файлов манифеста данной сборки - {assembly.GetFile(filePath)}\n");
            //GetTypeInfo(asmType);

            // 2
            Type type = Type.GetType("ClassLibrary.EmployedEducationalClases.DataAnalyzer, ClassLibrary", true, true);

            Console.WriteLine("Информация о классе DataAnalyzer из ClassLibrary");
            GetTypeInfo(type);

            // 3
            object     obj           = Activator.CreateInstance(type);
            MethodInfo privateMethod = type.GetMethod("isValid", BindingFlags.Instance | BindingFlags.NonPublic);
            MethodInfo publicMethod  = type.GetMethod("IsFloatNumber");
            char       symbol        = 'x';
            object     isValid       = privateMethod?.Invoke(obj, new object[] { symbol });

            Console.WriteLine($"Is {symbol} float number - {isValid}");
            string number        = "5.63";
            object isFloatNumber = publicMethod?.Invoke(obj, new object[] { number });

            Console.WriteLine($"Is {number} float number - {isFloatNumber}");

            // 4
            User2 eugene = new User2("Eugene", 19);
            User2 artem  = new User2("Artem", 1323);

            Console.WriteLine($"Is Artem validate - {ValidateUser(artem)}");

            Console.WriteLine($"Is Evgene validate - {ValidateUser(eugene)}");
        }