Рефлексия (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# — мощный инструмент для динамического анализа и управления кодом, но её использование следует тщательно продумывать, учитывая производительность и безопасность.