← Назад к вопросам

Для чего нужна рефлексия?

2.0 Middle🔥 111 комментариев
#C# и ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Рефлексия в C# и Unity

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

Основные применения рефлексии

1. Инспекция типов и метаданных

Рефлексия позволяет получить информацию о структуре класса во время выполнения программы.

public class ReflectionExample
{
    public void InspectType(object obj)
    {
        Type type = obj.GetType();
        Debug.Log($"Type name: {type.Name}");
        
        MethodInfo[] methods = type.GetMethods();
        foreach (MethodInfo method in methods)
        {
            Debug.Log($"Method: {method.Name}");
        }
        
        FieldInfo[] fields = type.GetFields();
        foreach (FieldInfo field in fields)
        {
            Debug.Log($"Field: {field.Name} ({field.FieldType})");
        }
        
        PropertyInfo[] properties = type.GetProperties();
        foreach (PropertyInfo prop in properties)
        {
            Debug.Log($"Property: {prop.Name}");
        }
    }
}

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

Рефлексия позволяет создавать экземпляры типов без явного знания их на этапе компиляции.

public class EnemyFactory
{
    public Enemy CreateEnemy(string enemyTypeName)
    {
        Type type = Type.GetType(enemyTypeName);
        if (type != null)
        {
            return (Enemy)Activator.CreateInstance(type);
        }
        return null;
    }
}

3. Вызов методов динамически

Это полезно, когда метод или поле неизвестны на этапе компиляции.

public class ScriptRunner
{
    public void ExecuteMethod(object instance, string methodName, params object[] parameters)
    {
        Type type = instance.GetType();
        MethodInfo method = type.GetMethod(methodName);
        
        if (method != null)
        {
            method.Invoke(instance, parameters);
        }
    }
    
    public object GetFieldValue(object instance, string fieldName)
    {
        Type type = instance.GetType();
        FieldInfo field = type.GetField(fieldName);
        
        return field?.GetValue(instance);
    }
}

4. Создание инспекторов и эдиторских инструментов

В Unity рефлексия используется для автоматических инспекторов.

5. Сериализация данных

Рефлексия используется при сохранении и загрузке данных из JSON или других форматов.

6. Работа с атрибутами

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

[AttributeUsage(AttributeTargets.Method)]
public class GameEventAttribute : Attribute
{
    public string EventName { get; set; }
}

public class EventManager
{
    public void RegisterEvents(object instance)
    {
        Type type = instance.GetType();
        MethodInfo[] methods = type.GetMethods();
        
        foreach (MethodInfo method in methods)
        {
            GameEventAttribute attr = (GameEventAttribute)Attribute.GetCustomAttribute(method, typeof(GameEventAttribute));
            if (attr != null)
            {
                Debug.Log($"Registered event: {attr.EventName}");
            }
        }
    }
}

Важные замечания

  • Производительность: рефлексия работает медленнее обычного кода
  • Безопасность: убедись, что динамически загружаемые типы безопасны
  • Кеширование: кэшируй результаты рефлексии для улучшения производительности
  • IL2CPP и мобильные платформы: рефлексия может быть ограничена на мобильных платформах