Что такое рефлексия в C#
Что проверяют
Знаете ли, что рефлексия читает метаданные сборки во время выполнения, где она уместна и чем за неё платят. Хороший ответ обязательно упирается в цену вызова и в то, что рефлексия ломает статический анализ.
Как отвечать
Рефлексия это System.Reflection: по объекту Type можно перечислить члены сборки, найти метод, свойство или атрибут, создать экземпляр, вызвать метод, прочитать и записать поле, в том числе закрытое, через BindingFlags.NonPublic.
Где она реально работает: сериализаторы, ORM с маппингом колонок на свойства, контейнеры внедрения зависимостей, тестовые фреймворки, которые ищут методы по атрибутам, загрузка плагинов из внешних сборок.
var type = typeof(Example);
var instance = Activator.CreateInstance(type);
type.GetProperty("Name")!.SetValue(instance, "Мир");
type.GetMethod("Display")!.Invoke(instance, null);Про цену: поиск члена по строке и Invoke на порядки медленнее прямого вызова, плюс упаковка аргументов в массив object. Если место горячее, MemberInfo кэшируют, а ещё лучше один раз компилируют делегат через Delegate.CreateDelegate или деревья выражений. В современном .NET значительную часть этих задач закрывают генераторы исходного кода: код появляется на этапе компиляции, работает быстрее и переживает обрезку сборки.
Где спотыкаются
Ищут член заново на каждой итерации цикла. GetMethod внутри обработчика запроса это самый частый способ получить непонятную просадку, которую потом ищут в базе.
Считают, что доступ к приватным членам чужого типа это нормальный приём. Технически он есть, но код завязывается на деталь реализации, которую автор поменяет в любом патче, и сломается это молча, уже в рантайме.
Забывают про trimming и Native AOT. Тип, который нигде не упомянут статически, обрезчик выбрасывает, и приложение падает при первом обращении. По той же причине ответ про сериализацию через рефлексию без слов о генераторах звучит устаревшим.