Activator.CreateInstance (Type T) возвращает ноль - PullRequest
0 голосов
/ 31 января 2019

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

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

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

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

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

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

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 ]

0 голосов
/ 02 февраля 2019

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

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

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

0 голосов
/ 31 января 2019

Пожалуйста, загрузите все сборки перед созданием типа в методе 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;

    }
}

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

...