Что такое рефлексия?csharp-80

Рефлексия — это механизм в .NET, который позволяет анализировать и модифицировать структуры кода во время выполнения. Это мощный инструмент, который дает возможность работать с типами, их членами и атрибутами динамически.

Основные возможности рефлексии

  1. Инспекция типов:
    • Получение информации о классах, интерфейсах, структурах
    • Анализ членов типа: полей, свойств, методов, событий
Type type = typeof(string);
Console.WriteLine($"Type: {type.Name}");
Console.WriteLine($"Methods: {type.GetMethods().Length}");
  1. Динамическое создание экземпляров:
    • Активация объектов без явного указания типа на этапе компиляции
object instance = Activator.CreateInstance(typeof(MyClass));
  1. Динамический вызов методов:
    • Вызов методов по имени во время выполнения
MethodInfo method = type.GetMethod("ToUpper");
string result = (string)method.Invoke("hello", null);
  1. Работа с атрибутами:
    • Чтение и анализ атрибутов в runtime
var attributes = type.GetCustomAttributes(false);

Где применяется рефлексия?

  1. Сериализация/десериализация
    (JSON, XML, Binary)

  2. DI-контейнеры
    (Autofac, Ninject)

  3. ORM-системы
    (Entity Framework, Dapper)

  4. Динамические прокси
    (AOP, Mocking frameworks)

  5. Плагинные системы
    (Загрузка и анализ сборок)

Производительность и ограничения

  1. Медленнее статического кода:
    • Вызов через Reflection в 100-1000 раз медленнее
    • Решение: кэширование MemberInfo или использование Expression Trees
// Оптимизация через кэширование
private static MethodInfo _methodCache = typeof(string).GetMethod("ToUpper");

// Expression Trees для быстрых динамических вызовов
var param = Expression.Parameter(typeof(string));
var call = Expression.Call(param, _methodCache);
var lambda = Expression.Lambda<Func<string, string>>(call, param);
var func = lambda.Compile();
string result = func("hello");
  1. Проблемы безопасности:

    • Требует повышенных прав (в некоторых контекстах)
    • Может обходить инкапсуляцию
  2. Сложность отладки:

    • Ошибки обнаруживаются только в runtime

Альтернативы в современных .NET

  1. Expression Trees
    (Более безопасно и быстрее)

  2. Source Generators
    (Генерация кода на этапе компиляции)

  3. Dynamic
    (Для простых сценариев)

Резюмируем:

рефлексия — это мощный инструмент для метапрограммирования в .NET, который следует использовать осмотрительно. Она открывает возможности для создания гибких архитектур, но требует понимания компромиссов в производительности и безопасности.