Ответ
Reflection (отражение) в C# — это механизм времени выполнения, который позволяет инспектировать метаданные сборок, модулей и типов, а также динамически создавать экземпляры классов, вызывать методы и получать или устанавливать значения полей.
Основное применение:
- Динамическая загрузка сборок и создание экземпляров (например, для плагинов).
- Фреймворки сериализации/десериализации (например, JSON, XML).
- ORM (Object-Relational Mapper) для маппига свойств объектов на столбцы таблиц.
- Инструменты анализа кода и тестирования.
Пример использования:
using System.Reflection;
// Получаем тип класса string
Type stringType = typeof(string);
// Получаем метод ToUpper
MethodInfo toUpperMethod = stringType.GetMethod("ToUpper", new Type[0]);
// Вызываем метод на конкретном экземпляре
object result = toUpperMethod.Invoke("hello", null);
Console.WriteLine(result); // Выведет: HELLO
Ключевые нюансы и ограничения:
- Производительность: Операции рефлексии значительно медленнее статического вызова кода, так как требуют проверок во время выполнения. В критичных по производительности местах следует избегать рефлексии или кэшировать полученные объекты (например,
MethodInfo). - Безопасность: Рефлексия может нарушать инкапсуляцию, предоставляя доступ к приватным (
private) и защищённым (protected) членам при использовании флагаBindingFlags.NonPublic. Это требует соответствующих разрешений безопасности. - Исключения: Использование может приводить к исключениям времени выполнения, таким как
ArgumentNullException,MissingMethodException,TargetInvocationException. - Поддержка AOT: В средах с компиляцией Ahead-of-Time (AOT), таких как некоторые мобильные платформы или .NET Native, использование рефлексии может быть ограничено и требует специальной настройки.