Комментарии (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 и мобильные платформы: рефлексия может быть ограничена на мобильных платформах