Функция которая выполняется если класс наследуется от определенного интерфейса C#

У меня есть интерфейс IWeapon. Я хочу что бы все классы которые реализуют IWeapon добавлялись в выпадающий список. Я могу пополнить этот список одной строчкой кода, но в какую функцию ее написать чтобы после сохранения файла(пересборки всего проекта) выполнять эту строчку. Пересматривать все классы в проекте не вариант, так как классов будет становится все больше и это будет замедлять пересборку проекта.


Ответы (1 шт):

Автор решения: aepot

Не нужно создавать 200 классов если у вас будет 200 видов оружия. Класс нужно создавать только на тип вооружения, например стрелковое, гранаты и т.д. Всё остальное должно регулироваться параметрами из данных, а не быть захардкожено. То есть чтобы добавить новый пистолет в игру, нужно создать для него файл с данными, а не переписывать код и не пересобирать проект. Избавляйтесь от хардкода. По формату для хранилища попробуйте сериализацию в JSON. Для Unity есть мощная библиотека JSON.NET, которая умеет сериализовать в том числе типы объектов (Type Name Handling). То есть все свои IWeapon[] можно записать в файл одной строчкой кода, и так же одной строчкой кода прочитать.

Следовательно и получать список классов не придется, ну если вы конечно не захотите создать редактор пушек, где придется для создания новой пушки цеплять исполняющий ее скрипт.

Грубо говоря, у вас не должно быть разных классов, где код одинаковый, а отличаются только данные.

А игроку надо локализованные названия показывать, а не внутренние названия классов.

А что касается вопроса, то можно использовать рефлексию.

Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type type in types.Where(t => typeof(IWeapon).IsAssignableFrom(t))
{
    Debug.Log(type.Name);
}
→ Ссылка