Что такое рефлексия в C# и как получить тип объекта?
Слышал про «рефлексию» и методы typeof, GetType. Что это вообще такое и зачем нужно копаться в типах во время выполнения?
Type t = typeof(string);
Type t2 = obj.GetType();
2 ответа
Рефлексия (Reflection) — это возможность исследовать и изменять метаданные типов во время выполнения: узнавать поля, свойства, методы, создавать объекты и вызывать методы по имени, без знания типа на этапе компиляции.
Отправная точка — объект Type. Получить его можно двумя способами:
Type t1 = typeof(string); // когда тип известен в коде
object obj = "привет";
Type t2 = obj.GetType(); // когда есть только экземпляр
Дальше через Type можно перебрать членов:
Type t = typeof(DateTime);
foreach (var prop in t.GetProperties())
Console.WriteLine(prop.Name); // Year, Month, Day...
// создать объект и вызвать метод по имени
object inst = Activator.CreateInstance(typeof(StringBuilder));
MethodInfo m = typeof(StringBuilder).GetMethod("Append", new[] { typeof(string) });
m.Invoke(inst, new object[] { "hi" });
Где применяют: сериализаторы (JSON), ORM, DI-контейнеры, тестовые фреймворки, плагины. Минус — это медленно, поэтому в горячем коде кэшируйте Type/MethodInfo.
Важное уточнение про разницу: typeof(T) работает с типом, известным при компиляции, а GetType() — это метод объекта, возвращающий реальный тип экземпляра в рантайме (учитывает полиморфизм).
object o = "text";
Console.WriteLine(o.GetType()); // System.String (реальный тип!)
Console.WriteLine(typeof(object)); // System.Object