C # Как создать экземпляр из заданного отражения типа из списка типов в поле со списком - PullRequest
0 голосов
/ 02 ноября 2018

List<Type> BotNames = typeof(BotPlayer).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(BotPlayer))).ToList();

Я поместил этот список в поле со списком, которое будет отображаться пользователю в раскрывающемся меню. Я пытаюсь создать экземпляр выбранного элемента поля со списком, который является подклассом класса с именем BotPlayer и предназначен для использования метода с именем "Move", который присутствует в классе и всех его подклассах. Я также пытаюсь передать этот экземпляр в переменную BotPlayer с именем Bot. Я пробовал разные способы использования Activator.CreateInstance, но, похоже, он мне не подходит или я не понимаю этого достаточно, чтобы внедрить его в свою собственную программу. Это было самое дальнее, что я смог получить

Bot = (BotPlayer)Activator.CreateInstance((Type)Difficulty.SelectedItem);

Когда я запускаю свою программу, она выдает мне такую ​​ошибку: «System.MissingMethodException:« Для этого объекта не определен конструктор без параметров »."

Это код для поля со списком, который существует в Designer.cs

            this.Difficulty.FormattingEnabled = true;
        this.Difficulty.Items.AddRange(BotNames.ToArray());
        this.Difficulty.Location = new System.Drawing.Point(205, 181);
        this.Difficulty.Name = "Difficulty";
        this.Difficulty.Size = new System.Drawing.Size(137, 21);
        this.Difficulty.TabIndex = 3;

Это код для поля со списком, который существует в обычном файле CS

        if (Difficulty.SelectedItem != null)
        {
            Bot = (BotPlayer)Difficulty.SelectedItem;    //This is called casting
            Bot.Type = BotType;
            //Bot = (BotPlayer)Activator.CreateInstance((Type)Difficulty.SelectedItem);
            //Bot = (BotPlayer)Activator.CreateInstance("MyAssembly", "BotPlayer");
        }

Это конструктор BotPlayer

       public BotPlayer(GameBoard board, SquareValues type)
    {
        Type = type;
        Board = board;
       // Difficuty = difficulty;
    }

Это конструктор для всех его подклассов

    public BotPlayer1(GameBoard board, SquareValues type) : base(board, type)
    {
        Board = board;
        Type = type;
        BotName = "Level 1";          
    }

Единственная разница между подклассами - это число в конце BotPlayer и имя бота, которое эквивалентно этому числу со словом «Level» за ним

1 Ответ

0 голосов
/ 05 ноября 2018
Bot = (BotPlayer)Activator.CreateInstance((Type)Difficulty.SelectedItem,Board,BotType);

Я обнаружил, что все, что мне нужно было сделать, это передать параметры в Activator.CreateInstance.

Спасибо @elgonzo и @Neil за помощь в этом.

...