Главная » Просмотр файлов » 1629295407-c61bfe4caba98380ea3e7cdae6295416

1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 83

Файл №846200 1629295407-c61bfe4caba98380ea3e7cdae6295416 (Шилдт Герберт - Полный справочник по C#) 83 страница1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200) страница 832021-08-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 83)

Это чрезвычайно мощное средство, поскольку,получив информацию о типе, можно вызвать конструкторы этого типа, его методы ииспользовать его свойства. Таким образом, отражение позволяет использовать код, которыйнедоступен в период компиляции программы.Программный интерфейс Reflection API —довольно обширная тема, и здесьневозможно рассмотреть ее в полном объеме. (Полное описание Reflection API — этоматериал для целой книги!) Но интерфейс Reflection API столь логичен, что, поняв, какиспользовать одну его часть, нетрудно разобраться во всем остальном. В следующихразделах описаны ключевые способы применения средства отражения: получениеинформации о методах, вызов методов, создание объектов и загрузка типов изкомпоновочных файлов.Получение информации о методахС помощью Type-объекта можно получить список методов, поддерживаемыхзаданным типом.

Для этого используется метод GetMethods(). Один из форматов еговызова таков:MethodInfo[] GetMethods()Глава 17. Динамическая идентификация типов, отражение и атрибуты455Метод GetMethods() возвращает массив объектов типа MethodInfo, которыеописывают методы, поддерживаемые вызывающим типом. Класс MethodInfо определен впространстве имен System.Reflection.Класс MethodInfo — производный от абстрактного класса MethodBase, который,в свою очередь, выведен из класса MemberInfo. Таким образом, программисту доступнысвойства и методы, определенные во всех трех классах. Например, чтобы получить имяметода, используйте свойство Name. Особого внимания заслуживают два члена классаMethodInfo: ReturnType и GetParameters().Свойство ReturnType, которое имеет тип Туре, позволяет получить тип значения,возвращаемого методом.Метод GetParameters() возвращает список параметров, связанных с методом.Формат его вызова таков:ParameterInfo[] GetParameters()Информация о параметрах содержится в объекте класса ParameterInfo.

В классеParameterInfo определено множество свойств и методов, которые используются дляописания параметров. Из них стоит обратить внимание на следующие два: свойство Name,которое представляет собой строку, содержащую имя параметра, и свойствоParameterType, которое описывает тип параметра. Тип параметра инкапсулирован вобъекте класса Туре.Рассмотрим программу, в которой средство отражения используется для полученияметодов, поддерживаемых классом MyClass.

Для каждого метода программа отображаетего имя и тип возвращаемого им значения, а также имя и тип всех параметров, которыеможет иметь тот или иной метод.// Анализ методов с помощью средства отражения.using System;using System.Reflection;class MyClass {int x;int y;public MyClass(int i, int j) {x = i;y = j;}public int sum() {return x+y;}public bool isBetween(int i) {if(x < i && i < y) return true;else return false;}public void set(int a, int b) {x = a;y = b;}public void set(double a, double b) {x = (int) a;y = (int) b;456Часть I.

Язык C#}}public void show() {Console.WriteLine(" x: {0}, y: {1}", x, y);}class ReflectDemo {public static void Main() {Type t = typeof(MyClass); // Получаем Type-объект,// представляющий MyClass.Console.WriteLine("Анализ методов, определенных в " + t.Name);Console.WriteLine();Console.WriteLine("Поддерживаемые методы: ");MethodInfo[] mi = t.GetMethods();// Отображаем методы, поддерживаемые классом MyClass.foreach(MethodInfo m in mi) {// Отображаем тип значения, возвращаемого методом,// и имя метода.Console.Write(" " + m.ReturnType.Name +" " + m.Name + "(");// Отображаем параметры.ParameterInfo[] pi = m.GetParameters();for(int i=0; i < pi.Length; i++) {Console.Write(pi[i].ParameterType.Name +" " + pi[i].Name);if(i+1 < pi.Length) Console.Write(", ");}Console.WriteLine(")");}}}Console.WriteLine();Результаты выполнения этой программы такие:Анализ методов, определенных в MyClassПоддерживаемые методы:Int32 GetHashCode()Boolean Equals(Object obj)String ToString()Int32 sum()Boolean isBetween(Int32 i)Void set(Int32 a, Int32 b)Глава 17.

Динамическая идентификация типов, отражение и атрибуты457Void set(Double a, Double b)Void show()Type GetType()Обратите внимание на то, что помимо методов, определенных в классе MyClass,здесь также отображаются методы, определенные в классе object. Дело в том, что всетипы в C# выведены из класса object. Также стоит отметить, что для имен типов здесьиспользуются имена .NET-структуры.

Обратите внимание еще на то, что метод set()отображен дважды. Этому есть простое объяснение: метод set() перегружен. Одна еговерсия принимает аргументы типа int, а вторая — аргументы типа double.Эта программа требует некоторых пояснений. Прежде всего, отметим, что в классеMyClass определяется public-конструктор и ряд public-методов, включаяперегруженный метод set(). При выполнении строки кода из метода Main() получаемобъект класса Туре, представляющий класс MyClass:Type t = typeof(MyClass);// Получаем Type-объект,// представляющий MyClass.Используя переменную t и интерфейс Reflection API, программа отображаетинформацию о методах, поддерживаемых классом MyClass. Сначала с помощьюследующей инструкции получаем список методов:MethodInfo[] mi = t.GetMethods();Затем выполняется цикл foreach, на итерациях которого для каждого методаотображается тип возвращаемого им значения, имя метода и его параметры:// Отображаем тип значения, возвращаемого методом,// и имя метода.Console.Write(" " + m.ReturnType.Name +" " + m.Name + " (");// Отображаем параметры.ParameterInfo[] pi = m.GetParameters();for(int i=0; i < pi.Length; i++) {Console.Write(pi[i].ParameterType.Name +" " + pi[i].Name);if(i+1 < pi.Length)Console.Write(", ");}В этом фрагменте программы информация о параметрах каждого метода считываетсяпосредством вызова метода GetParameters() и сохраняется в массиве pi.

Затем в циклеfor выполняется опрос массива pi и отображается тип каждого параметра и его имя.Главное здесь то, что эта информация считывается динамически во время выполненияпрограммы, т.е. без предварительной информации о классе MyClass.Второй формат вызова метода GetMethods()Второй формат вызова метода GetMethods() позволяет задать различные флаги,которые фильтруют возвращаемые методы.

Этот формат таков:MethodInfo[] GetMethods(BindingFlags flags)Эта версия получает только те методы, которые соответствуют заданному критерию.BindingFlags — это перечисление. Ниже описаны наиболее употребительные егозначения:458Часть I. Язык C#ЗначениеОписаниеDeclaredOnlyСчитывание только тех методов, которые определены в заданном классе.Унаследованные методы в результат не включаютсяСчитывание методов экземпляровСчитывание нe-public-методовСчитывание public-методовСчитывание static-методовInstanceNonpublicPublicstaticДва или больше задаваемых флагов можно объединять с помощью оператора ИЛИ.

Сфлагами Public или Nonpublic необходимо устанавливать флаги Instance илиStatic. В противном случае метод GetMethods() не возвратит ни одного метода.Одно из основных применений BindingFlags-формата, используемого при вызовеметода GetMethods(), — получение списка определенных в классе методов, но без учетаунаследованных. Этот вариант особенно полезен в случае, когда нам не нужна информацияо методах, определенных объектом. Попробуем, например, заменить вызов методаGetMethods() в предыдущей программе таким вариантом:// Теперь получим только те методы, которые объявлены// в классе MyClass.MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly |BindingFlags.Instance |BindingFlags.Public);После внесения в программу этого изменения получаем следующие результаты:Анализ методов, определенных в MyClassПоддерживаемые методы:Int32 sum()Boolean isBetween(Int32 i)Void set(Int32 a, Int32 b)Void set(Double a, Double b)Void show()Как видите, теперь отображены только те методы, которые явно определены в классеMyClass.Вызов методов с помощью средства отраженияЗная, какие методы поддерживает тип, можно вызвать любой из них.

Для этогоиспользуется метод Invoke(), который определен в классе MethodInfo. Формат еговызова таков:object Invoke(object ob, object[] args)Здесь параметр ob — это ссылка на объект, для которого вызывается нужный метод.Для static-методов параметр ob должен содержать значение null. Любые аргументы,которые необходимо передать вызываемому методу, указываются в массиве args. Еслиметод вызывается без аргументов, параметр args должен иметь null-значение. При этомдлина массива args должна совпадать с количеством аргументов, передаваемых методу.Следовательно, если необходимо передать два аргумента, массив args должен состоять издвух элементов, а не, например, из трех или четырех.Глава 17.

Динамическая идентификация типов, отражение и атрибуты459Для вызова нужного метода достаточно вызвать метод Invoke() для экземпляракласса MethodInfo, полученного в результате вызова метода GetMethods(). Этапроцедура демонстрируется следующей программой:// Вызов методов с использованием средства отражения.using System;using System.Reflection;class MyClass {int x; int y;public MyClass(int i, int j) {x = i;y = j;}public int sum() {return x + y;}public bool isBetween(int i) {if((x < i) && (i < y)) return true;else return false;}public void set(int a, int b) {Console.Write("Внутри метода set(int, int).

");x = a;y = b;show();}// Перегруженный метод set.public void set(double a, double b) {Console.Write("Внутри метода set(double, double). ");x = (int) a;y = (int) b;show();}}public void show() {Console. WriteLine("Значение x: {0}, значение y: {1}", x, y);}class InvokeMethDemo {public static void Main() {Type t = typeof(MyClass);MyClass reflectOb = new MyClass(10, 20);int val;Console.WriteLine("Вызов методов, определенных в " +t.Name);Console.WriteLine();MethodInfo[] mi = t.GetMethods();460Часть I.

Язык C#}}// Вызываем каждый метод.foreach(MethodInfo m in mi) {// Получаем параметры.ParameterInfo[] pi = m.GetParameters();if(m.Name.CompareTo("set")==0 &&pi[0].ParameterType == typeof(int)) {object[] args = new object[2];args[0] = 9;args[1] = 18;m.Invoke(reflectOb, args);}else if(m.Name.CompareTo("set")==0 &&pi[0].ParameterType == typeof(double)) {object[] args = new object[2];args[0] = 1.12; args[1] = 23.4;m.Invoke(reflectOb, args);}else if(m.Name.CompareTo("sum")==0) {val = (int) m.Invoke(reflectOb, null);Console.WriteLine("Результат вызова метода sum равен " + val);}else if(m.Name.CompareTo("isBetween")==0) {object[] args = new object[1];args[0] = 14;if((bool) m.Invoke(reflectOb, args))Console.WriteLine("14 находится между x и y.");}else if(m.Name.CompareTo("show")==0) {m.Invoke(reflectOb, null);}}Результаты выполнения этой программы таковы:Вызов методов, определенных в MyClassРезультат вызова метода sum равен 3014 находится между x и y.Внутри метода set(int, int).

Характеристики

Тип файла
PDF-файл
Размер
5,05 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6439
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее