C # отражение (Отражение)
Отражение средства могут получить доступ к программе, его способность определять и изменять свое собственное состояние или поведение.
Сборка содержит модуль, который содержит типы, которые, в свою очередь, содержит элементы. Отражение предоставляет объектно пакет узлы, модули и типы.
Вы можете использовать отражение для динамического создания экземпляра типа, тип привязан к существующему объекту или получить тип из существующего объекта. Затем можно вызвать тип захода на посадку или получить доступ к его полям и свойствам.
Доводы за и против
Преимущества:
- 1, что отражает повышение гибкости процесса и масштабируемости.
- 2, уменьшают сцепление, увеличение способности к адаптации.
- 3, что позволяет программе создавать и контролировать любой тип объекта, без предварительного жестко закодированы целевого класса.
Недостатки:
- 1, проблемы с производительностью: использование по сути является отражением, поясняющая работу, когда поля и методы для доступа к гораздо медленнее, чем прямой код. Таким образом, отражение на главной гибкости и масштабируемости приложений требуют рамки, не рекомендуется общая процедура.
- 2, использование нечетких отражений внутри программной логики, программисты хотят видеть логику в исходном коде, но отражение не будут использовать технологию исходного кода, который будет приносить проблемы с техническим обслуживанием, а также код отражения более сложный, чем соответствующий код непосредственно ,
Reflex (Отражение) использует
Reflex (Отражение) для следующих целей:
- Это позволяет просматривать свойства во время выполнения (атрибут) информации.
- Это позволяет обзор коллекции различных типов, а также примеры этих типов.
- Это позволяет позднее связывание методов и свойств (свойство).
- Это позволяет создавать нового типа во время выполнения, а затем, используя эти типы выполнения некоторых задач.
Просмотр метаданных
Мы уже упоминали в разделе выше, использование отражения (отражения) можно просмотреть свойства (атрибут) информацию.
ОбъектSystem.Reflection MemberInfoкласс должен быть инициализирован, для обнаружения свойств , связанных с классом (атрибут). Для этого, вы можете определить класс целевого объекта, следующим образом:
System.Reflection.MemberInfo информация = TypeOf (MyClass);
Следующая программа демонстрирует эту точку зрения:
с помощью системы; [AttributeUsage (AttributeTargets.All)] Класс HelpAttribute общественности: System.Attribute { общественного чтения строки URL; Тема общественного строка // Тема является именованным (названные) параметры { получить { вернуться тему; } комплект { тема = значение; } } общественного HelpAttribute (строка URL) // URL является (позиционная) параметр позиционирования { this.Url = URL; } частная строка темы; } [HelpAttribute ( "Информация о классе MyClass")] класс MyClass { } пространство имен AttributeAppl { класс программы { статической силы основных (String [] агдз) { System.Reflection.MemberInfo информация = TypeOf (MyClass); Object [] атрибуты = info.GetCustomAttributes (истина); для (INT I = 0; я <attributes.Length; я ++) { System.Console.WriteLine (атрибуты [я]); } Console.ReadKey (); } } }
Когда приведенный выше код компилируется и запускается, он будет отображать пользовательские свойства , прикрепленные к классуMyClassна:
HelpAttribute
примеров
В этом примере мы будем использоватьDebugInfoсобственность , созданную в предыдущей главе, и использует отражения (Reflection) для чтения метаданных классаRectangle.
с помощью системы; используя System.Reflection; Пространство имен BugFixApplication { // BugFix пользовательское свойство присваивается класс и его члены [AttributeUsage (AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = истина)] DebugInfo общественного класса: System.Attribute { частное INT Bugno; частный застройщик строка; частная строка lastReview; Разъяснительная строка; общественного DebugInfo (INT Б.Г., строка DEV, строка d) { this.bugNo = BG; this.developer = DEV; this.lastReview = d; } общественное INT Bugno { получить { вернуть Bugno; } } публичная строка Разработчик { получить { вернуть разработчику; } } публичная строка LastReview { получить { вернуть lastReview; } } публичная строка сообщений { получить { возвращать сообщение; } комплект { сообщение = значение; } } } [DebugInfo (45, "Зара Али", "12/8/2012", Message = "Возвращение типа несоответствие")] [DebugInfo (49, "Нуха Али", "10/10/2012", Message = "Неиспользованные переменная")] класс Прямоугольник { // Переменные-члены защищены двойной длины; защищенный двойной ширины; общественный прямоугольник (двойной л, двойной вес) { длина = л; ширина = ш; } [DebugInfo (55, "Зара Али", "19/10/2012", Message = "Возвращение типа несоответствие")] общественный двойной GetArea () { вернуться длина * ширина; } [DebugInfo (56, "Зара Али", "19/10/2012")] общественного недействительными Дисплей () { Console.WriteLine ( "Длина: {0}", длина); Console.WriteLine ( "Ширина: {0}", ширина); Console.WriteLine ( "Площадь: {0}", GetArea ()); } } // Конец класса Rectangle класс ExecuteRectangle { статической силы основных (String [] агдз) { Прямоугольник г = новый прямоугольник (4.5, 7.5); r.Display (); Тип Тип = TypeOf (прямоугольник); // Traverse класс Rectangle атрибуты Еогеасп (атрибуты объекта в type.GetCustomAttributes (ложь)) { DebugInfo DBI = (DebugInfo) атрибутов; если (нуль! = DBI) { не Console.WriteLine ( "Ошибка №: {0}", dbi.BugNo); Console.WriteLine ( "Разработчик: {0}", dbi.Developer); Console.WriteLine ( "Последний Отзыв: {0}", dbi.LastReview); Console.WriteLine ( "Примечания: {0}", dbi.Message); } } // Итерация метод атрибутов Еогеасп (MethodInfo м в type.GetMethods ()) { Еогеасп (приписывать в m.GetCustomAttributes (истина)) { DebugInfo DBI = (DebugInfo) а; если (нуль! = DBI) { не Console.WriteLine ( "Ошибка №: {0}, для метода: {1}", dbi.BugNo, m.Name); Console.WriteLine ( "Разработчик: {0}", dbi.Developer); Console.WriteLine ( "Последний Отзыв: {0}", dbi.LastReview); Console.WriteLine ( "Примечания: {0}", dbi.Message); } } } Console.ReadLine (); } } }
Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:
Длина: 4,5 Ширина: 7,5 Площадь: 33,75 Ошибка No: 49 Разработчик: Нуха Ali Последнее Отзыв: 10/10/2012 Примечания: Не используется переменная Ошибка No: 45 Разработчик: Zara Ali Последнее Отзыв: 12/8/2012 Примечания: Возвращаемый тип несоответствие Ошибка No: 55, для метода: GetArea Разработчик: Zara Ali Последнее Отзыв: 19/10/2012 Примечания: Возвращаемый тип несоответствие Ошибка No: 56, для метода: Дисплей Разработчик: Zara Ali Последнее Отзыв: 19/10/2012 Примечания: