РЕДАКТИРОВАТЬ: этот код работает как пользовательский код инспектора в единстве, но я не уверен, если это уместно, если это так, я опубликую весь класс.
Я хочу получить все классы, которыереализует определенный интерфейс и показывает список опций, чтобы пользователь мог выбрать, как реализовать интерфейс.
Это простой интерфейс, описывающий поведение персонажа.
Я попытался заменитьИнтерфейс с абстрактным классом, но безрезультатно ...
В отладке я вижу, что возвращаемые значения равны нулю.
Все, что я нашел в Интернете, говорит, что тип может несуществует, но в моем случае это невозможно, потому что я получаю свой тип, используя отражение.
ICombatBehaviour combat;
private string[] FindAllCombatOptions(out List<Type> existingTypes)
{
List<string> options = new List<string>();
existingTypes = new List<Type>();
var combatBehaviours = Assembly.GetAssembly(typeof(ICombatBehaviour)).GetTypes()
.Where(myType => myType.IsClass && !myType.IsAbstract && typeof(ICombatBehaviour).IsAssignableFrom(myType));
foreach (var behaviour in combatBehaviours)
{
existingTypes.Add(behaviour);
options.Add(behaviour.Name);
}
return options.ToArray();
}
private void UpdateType(List<Type> types)
{
combat = Activator.CreateInstance(types[index]) as ICombatBehaviour;
}
Метод UpdateType()
, получает все типы, найденные методом FindAllCombatOptions()
, и принимает тип ввыбранный индекс.Тип правильный, но переменная combat
остается нулевой ...
ICombatBehavior:
public interface ICombatBehaviour
{
}
Реализующие классы:
public class FightBehaviour : ICombatBehaviour
{
}
public class EscapeBehaviour : ICombatBehaviour
{
}
Этовызывающая функция:
public override void SelectType()
{
List<Type> types;
string[] options = FindAllCombatOptions(out types);
index = AskUserForAType(options); // Currently returns only zero
UpdateType(types);
}