Что такое Reflection в C#?

«Что такое Reflection в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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, использование рефлексии может быть ограничено и требует специальной настройки.