Что такое рефлексия (Reflection) в C#

Рефлексия (Reflection) в C# — это механизм, позволяющий программам анализировать и изменять свою структуру во время выполнения. Она предоставляет доступ к информации о сборках, модулях, типах, методах, полях и других элементах кода.

Возможности рефлексии

  • Получение информации о типах во время выполнения.
  • Вызов методов и доступ к полям без их явного указания в коде.
  • Создание экземпляров объектов динамически.
  • Доступ к приватным членам классов.
  • Анализ и работа с атрибутами.

Использование рефлексии

Получение информации о типе

using System;
using System.Reflection;

class Example
{
    public int Number { get; set; }
    public void PrintMessage() => Console.WriteLine("Hello, Reflection!");
}

class Program
{
    static void Main()
    {
        Type type = typeof(Example);
        Console.WriteLine($"Имя класса: {type.Name}");
    }
}

Вызов метода через рефлексию

using System;
using System.Reflection;

class Example
{
    public void SayHello() => Console.WriteLine("Привет из рефлексии!");
}

class Program
{
    static void Main()
    {
        Example instance = new Example();
        MethodInfo method = typeof(Example).GetMethod("SayHello");
        method.Invoke(instance, null);
    }
}

Динамическое создание объектов

using System;
using System.Reflection;

class Example
{
    public Example() => Console.WriteLine("Экземпляр создан!");
}

class Program
{
    static void Main()
    {
        Type type = typeof(Example);
        object instance = Activator.CreateInstance(type);
    }
}

Применение атрибутов

Рефлексия позволяет анализировать атрибуты, что полезно для настройки поведения кода.

using System;
using System.Reflection;

class CustomAttribute : Attribute
{
    public string Description { get; }
    public CustomAttribute(string description) => Description = description;
}

[Custom("Пример класса с атрибутом")]
class Example { }

class Program
{
    static void Main()
    {
        Type type = typeof(Example);
        var attribute = (CustomAttribute)Attribute.GetCustomAttribute(type, typeof(CustomAttribute));
        Console.WriteLine(attribute.Description);
    }
}

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

  • Рефлексия медленнее, чем прямые вызовы, из-за дополнительных проверок.
  • Доступ к приватным членам может нарушать инкапсуляцию и снизить безопасность.
  • Частое использование рефлексии может усложнить отладку и поддержку кода.

Рефлексия в C# — мощный инструмент для динамического анализа и управления кодом, но её использование следует тщательно продумывать, учитывая производительность и безопасность.