Полное руководство по языку программирования С# 14 и платформе .NET 10 / Рефлексия

Применение рефлексии и исследование типов

Начальный ⏱ 3 мин чтения 👁 2 🕓 обновлено 11.08.2026

Получение всех компонентов типа

Метод GetMembers() возвращает все доступные компоненты типа в виде объекта MemberInfo. Этот объект позволяет извлечь некоторую информацию о компоненте типа. В частности, некоторые его свойства:

  • DeclaringType: возвращает полное название типа.

  • MemberType: возвращает значение из перечисления MemberTypes:

    • MemberTypes.Constructor

    • MemberTypes.Method

    • MemberTypes.Field

    • MemberTypes.Event

    • MemberTypes.Property

    • MemberTypes.NestedType

  • Name: возвращает название компонента

Применим метод GetMembers и выведем все доступные элементы типа:


using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers())
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}

В данном случае мы получим все общедоступные члены класса Person.

Person Method get_Age
Person Method set_Age
Person Method Print
System.Object Method GetType
System.Object Method ToString
System.Object Method Equals
System.Object Method GetHashCode
Person Constructor .ctor
Person Property Age

Обратите внимание, что в данном случае мы получаем только все публичные компоненты класса, и нам не выводится информация о приватной переменной name.

Кроме того, для свойства выводятся методы доступа - геттер (здесь get_Age) и сеттер (здесь set_Age).

Третий момент, который надо отметить, что по умолчанию мы получаем весь функционал, в том числе унаследованный от базовых классов (в данном случае функционал базового класса Object).

BindingFlags

В примере выше использовалась простая форма метода GetMembers(), которая извлекает все общедоступные публичные методы. Но мы можем использовать и другую форму метода: MembersInfo[] GetMembers(BindingFlags). Перечисление BindingFlags может принимать различные значения:

  • DeclaredOnly: получает только методы непосредственно данного класса, унаследованные методы не извлекаются

  • Instance: получает только методы экземпляра

  • NonPublic: извлекает не публичные методы

  • Public: получает только публичные методы

  • Static: получает только статические методы

Объединяя данные значения с помощью побитовой операции ИЛИ можно комбинировать вывод. Например, получим только компоненты непосредственно самого класса без унаследованных, как публичные, так и все остальные:


using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers(BindingFlags.DeclaredOnly
            | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}

И в данном случае мы получим несколько другой вывод:

Person Method get_Age
Person Method set_Age
Person Method Print
Person Constructor .ctor
Person Property Age
Person Field name
Person Field <Age>k__BackingField

Получение одного компонента по имени

Для получения одного компонента можно использовать метод GetMember(), в который передается имя компонента. И опционально можно передать флаги BindingFlags.


Type myType = typeof(Person);

// получаем метод print
MemberInfo[] print = myType.GetMember("Print", BindingFlags.Instance | BindingFlags.Public);
foreach (MemberInfo member in print)
{
    Console.WriteLine($"{member.MemberType} {member.Name}");
}

Стоит отметить, что при получении одного члена типа опять же возвращается массив MemberInfo[], поскольку в классе может быть несколько элементов с одним именем, например, несколько перегруженных версий метода Print.

Проверь себя

📋 Тест по теме «Применение рефлексии и исследование типов» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using _____.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers())
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System._____;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers(BindingFlags.DeclaredOnly
            | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Type myType = _____(Person);

// получаем метод print
MemberInfo[] print = myType.GetMember("Print", BindingFlags.Instance | BindingFlags.Public);
foreach (MemberInfo member in print)
{
    Console.WriteLine($"{member.MemberType} {member.Name}");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

_____ (MemberInfo member in myType.GetMembers())
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (_____ member in myType.GetMembers(BindingFlags.DeclaredOnly
            | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo _____ in myType._____())
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo _____ in myType.GetMembers(_____.DeclaredOnly
            | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

}
foreach (MemberInfo member in print)
MemberInfo[] print = myType.GetMember("Print", BindingFlags.Instance | BindingFlags.Public);
    Console.WriteLine($"{member.MemberType} {member.Name}");
// получаем метод print
Type myType = typeof(Person);
{
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Применение рефлексии и исследование типов»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Применение рефлексии и исследование типов», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers())
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Применение рефлексии и исследование типов»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

using System.Reflection;     // подключаем функционал рефлексии

Type myType = typeof(Person);

foreach (MemberInfo member in myType.GetMembers(BindingFlags.DeclaredOnly
            | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
{
    Console.WriteLine($"{member.DeclaringType} {member.MemberType} {member.Name}");
}

public class Person
{
    string name;
    public int Age { get; set; }
    public Person(string name, int age)
    {
        this.name = name;
        this.Age = age;
    }
    public void Print() => Console.WriteLine($"Name: {name} Age: {Age}");
}
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Применение рефлексии и исследование типов»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Применение рефлексии и исследование типов»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Применение рефлексии и исследование типов». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

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