-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReflectionTask.txt
More file actions
127 lines (92 loc) · 6.86 KB
/
ReflectionTask.txt
File metadata and controls
127 lines (92 loc) · 6.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Reflection — это мощный инструмент, который в играх используют для:
- Систем модификаций (Modding) — поиск и загрузка пользовательских классов/скиллов
- Редакторов уровней и инструментов — отображение всех полей объекта для редактирования
- Систем диалогов и квестов — вызов методов по имени из JSON/файлов конфигурации
- Инспекторы в консольных играх — отладка и просмотр состояния всех объектов
Задание: "Система отладки и дампа состояния игры (Game Debugger)"
Контекст
Ты разрабатываешь консольную RPG. В игре есть множество объектов: игрок, враги, NPC, предметы на земле, квесты.
Во время тестирования ты постоянно сталкиваешься с багами, и гейм-тестеры говорят:
"Вот тут у врага здоровье упало ниже нуля" или "Квест не засчитался, хотя предмет собран".
Твоя задача — написать универсальную систему отладки, которая сможет:
1. Показать состояние любого объекта — все его поля и их текущие значения (включая приватные).
2. Найти и вызвать любой метод по имени — для быстрого исправления состояния во время тестирования
(например, восстановить здоровье или принудительно завершить квест).
Этот инструмент поможет тестировщикам (и тебе) быстро понимать,
что происходит внутри игры, без необходимости перекомпилировать код.
Техническое задание
Создай статический класс GameDebugger с двумя методами:
1. void DumpObject(object obj, string objectName)
Выводит в консоль ВСЕ поля объекта (включая приватные, унаследованные и статические)
с их именами и текущими значениями.
Формат вывода:
=== Дамп объекта: [Имя объекта] ===
Тип: [Полное имя типа]
Поля:
- [Имя поля1] : [Тип] = [Значение]
- [Имя поля2] : [Тип] = [Значение]
...
=== Конец дампа ===
Пример:
=== Дамп объекта: Игрок ===
Тип: Player
Поля:
- _health : System.Int32 = 75
- _maxHealth : System.Int32 = 100
- Name : System.String = "Геральт"
- Level : System.Int32 = 5
=== Конец дампа ===
2. bool InvokeMethod(object obj, string methodName, params object[] parameters)
Пытается найти в объекте метод с указанным именем и вызвать его.
Возвращает true, если метод найден и вызван успешно, и false в противном случае.
При успешном вызове выводит результат метода в консоль (если метод возвращает не void).
Важные ограничения:
- Метод может быть любым (публичным, приватным, статическим, экземплярным).
- Нужно учитывать перегрузку — если есть несколько методов с одним именем, попытайся найти тот,
который подходит под переданные параметры (или выбери первый попавшийся для простоты).
- Обработай исключения — если метод выбросил ошибку, выведи сообщение об ошибке и верни false.
Пример использования
Создай несколько классов для демонстрации:
Класс Player:
Поля:
- private int _health
- private int _maxHealth
Свойства:
- public string Name
- public int Level
Методы:
- TakeDamage(int damage)
- Heal(int amount)
- int GetHealthPercent()
Класс Quest:
Поля:
- private string _title
- private bool _isCompleted
Свойства:
- public int RewardGold
Методы:
- Complete()
В Main() продемонстрируй работу:
- Объяви Player и Quest
- Сделай дамп обоих объектов: GameDebugger.DumpObject(player, "Игрок")
- Вызови каждый метод по имени: GameDebugger.InvokeMethod(player, "TakeDamage", 30)
- Попробуй вызвать несуществующий метод: GameDebugger.InvokeMethod(player, "FlyToMoon");
Бонус-задание (если будет легко):
Bonus 1: Добавь в DumpObject вывод свойств (properties) в дополнение к полям.
Bonus 2: В InvokeMethod добавь поддержку методов с out и ref параметрами
(это сложнее, требует дополнительной логики).
Важные ограничения:
1. Обрабатывай исключения — через try-catch, вывод ошибку в консоль, не давай программе крашиться.
2. Учитывай null — если объект null, выведи сообщение и не пытайся ничего делать.
3. Для статических полей и методов — передавай null в качестве объекта
(но это опционально, можно сделать отдельным методом).
Критерии оценки (для самопроверки):
- Умение получать Type через GetType() или typeof()
- Использование BindingFlags (NonPublic, Instance, Static, FlattenHierarchy)
- Поиск полей через GetFields()
- Поиск методов через GetMethod() или GetMethods() с учетом параметров
- Вызов методов через Invoke()
- Работа с параметрами (массив объектов)
- Обработка возвращаемых значений
- Обработка исключений
- Чистый и читаемый код