Получить экземпляр для каждого класса, который реализует интерфейс

1

Чтобы решить проблему, которую я имею в своем решении с использованием отражения, мне нужно указать следующий код, чтобы показать пользователю CheckedListBox, который предоставляет список условий, которые они должны выбрать, и в соответствии с их выбором он изменяет определенное поведение в приложении. В это время у меня нет проблем, чтобы получить имя строки унаследованных классов благодаря этому сообщению, но я не мог понять, как получить экземпляр каждого из них.

        DataTable table = new DataTable();
        table.Columns.Add("Intance", typeof(IConditions)); //INSTANCE of the inherited class
        table.Columns.Add("Description", typeof(string)); //name of the inherited class

        //list of all types that implement IConditions interface
        var interfaceName = typeof(IConditions);
        List<Type> inheritedTypes = (AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(s => s.GetTypes())
            .Where(p => interfaceName.IsAssignableFrom(p) && p != interfaceName)).ToList();

        foreach (Type type in inheritedTypes)
        {
            IConditions i; //here is where I don't know how to get the instance of the Type indicated by 'type' variable

            //I.E: IConditions I = new ConditionOlderThan20(); where 'ConditionOlderThan20' is a class which implements IConditions interface

            table.Rows.Add(i, type.Name);
        }

Можно ли получить объект? Каков лучший подход к решению таких проблем?

Теги:
inherited

1 ответ

1
Лучший ответ

Просто используйте метод Activator.CreateInstance:

IConditions i = Activator.CreateInstance(type) as IConditions;

Примечание. Это произойдет, если type не имеет конструктора без параметров. Вы можете использовать следующую версию с параметрами:

public static Object CreateInstance(Type type, params Object[] args)
  • 0
    Отличный Конрад !! Это то, что мне нужно! В моем случае конструктор не является проблемой, но является допустимым выражением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню