← Все вопросы

Что такое рефлексия в C# и как получить тип объекта?

Задан 7 месяцев назад624 просмотров2 ответа
7

Слышал про «рефлексию» и методы typeof, GetType. Что это вообще такое и зачем нужно копаться в типах во время выполнения?

Type t = typeof(string);
Type t2 = obj.GetType();

2 ответа

13
✓ Принятый ответ — помог автору

Рефлексия (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.

6

Важное уточнение про разницу: typeof(T) работает с типом, известным при компиляции, а GetType() — это метод объекта, возвращающий реальный тип экземпляра в рантайме (учитывает полиморфизм).

object o = "text";
Console.WriteLine(o.GetType());   // System.String (реальный тип!)
Console.WriteLine(typeof(object)); // System.Object

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект