Как реализовать соответствие между строковым именем класса и самим классом? - PullRequest
1 голос
/ 09 января 2020

У меня есть comboBox в моей форме. Когда я нажимаю на нее, список имен классов выскочил. И когда я выбираю какое-то имя класса, я хочу создать объект этого класса и затем работать с ним. Все мои классы имеют общего родителя, поэтому я использовал этот код, чтобы получить все мои подклассы:

var subclassTypes = Assembly
                    .GetAssembly(typeof(ParentClass))
                    .GetTypes()
                    .Where(t => t.IsSubclassOf(typeof(ParentClass)));

Итак, после этого я просто добавил это к ComboBox, и его работа в порядке, он показывает все классы мне нужны в строке. Но как я могу сделать соответствие между строковым именем класса и самим классом? Как я могу сохранить это соответствие и как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вы можете сохранить типы непосредственно в выпадающем списке и использовать свойство SelectedItem для извлечения их в событии SelectedIndexChanged:

List<Type> subclassTypes = Assembly
        .GetAssembly(typeof(ParentClass))
        .GetTypes()
        .Where(t => t.IsSubclassOf(typeof(ParentClass))).ToList();


comboBoxTypes.DataSource = subclassTypes;
comboBoxTypes.DisplayMember = "Name";

Используя метод Activator.CreateInstance Вы можете создать объект этого типа.

private void ComboBoxTypes_SelectedIndexChanged(object sender, EventArgs e)
{
    Type itemType = comboBoxTypes.SelectedItem as Type;

    ParentClass item = (ParentClass)Activator.CreateInstance(itemType);
}

Отказ от ответственности: это решение для конструктора без параметров!

2 голосов
/ 09 января 2020

У вас уже есть все Type ваших классов. Создание нового экземпляра одного из них в таком случае выглядит примерно так (при условии comboboxSelection в качестве имени выбранного класса):

var classType = subclassTypes.First(t => t.Name == comboBoxSelection);
var classInstance = Activator.CreateInstance(classType);

Обратите внимание, что в примере classInstance имеет тип object. Вы можете легко привести его к общему типу:

var classInstance = (ParentClass)Activator.CreateInstance(classType);

Обратите внимание, что для работы Activator.CreateInstance классы должны иметь конструктор без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...