Activator.CreateInstance(Type T) возвращает ноль

РЕДАКТИРОВАТЬ: Этот код работает как пользовательский код инспектора в единстве, но я не уверен, если это уместно, если это так, я опубликую весь класс.

Я хочу получить все классы, которые реализуют определенный интерфейс, и показать список опций, чтобы пользователь мог выбрать, как реализовать интерфейс.

Это простой интерфейс, который описывает поведение персонажа.

Я попытался заменить интерфейс абстрактным классом, но безрезультатно...

В отладке я вижу, что возвращаемые значения являются нулевыми.

Все, что я нашел в Интернете, говорит, что тип может не существовать, но в моем случае это невозможно, потому что я получаю свой тип с помощью отражения.

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);
    }

2 ответа

Решение

Решение было довольно простым. Проблема была не в коде, а в Unity3D.

Единство создало классы FightBehaviour а также EscapeBehaviour как класс MonoBehaviour, который не может быть создан. Поэтому мне нужно было установить его в нормальный класс.

Спасибо всем в комментариях, которые помогли мне, я действительно ценю это.

Пожалуйста, загрузите все сборки перед созданием типа в методе UpdateType.

private void UpdateType(List<Type> types)
{
    for(int index =0; index < types.Count; index++)
    {
          Assembly.Load(types[index].Assembly.FullName);
          combat = Activator.CreateInstance(types[index]) as ICombatBehaviour;

    }
}

Надеюсь это поможет.

Другие вопросы по тегам