Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как создать экземпляр UserControl-потомка?

Автор вопроса: AngryHackerОтветов: 2

Вот сценарий. У меня есть несколько UserControl, которые наследуются от MyBaseControl. Я хотел бы создать экземпляр UserControl на основе его имени. Например:

void foo(string NameOfControl) {
    MyBaseControl ctl = null;
    ctl = CreateObject(NameOfControl);  // I am making stuff up here,
                                        // CreateObject does not exist
}

Как создать экземпляр этого UserControl на основе его имени. У меня мог бы быть гигантский оператор switch, и это плохо пахнет. Все UserControls, включая их базовый класс, находятся в одном проекте и имеют одно и то же пространство имен.

inheritancewinformsuser-controls

Ответы

Ответ 1 · рейтинг 1 · logicnp

    void foo(string NameOfControl)
    {
        MyBaseControl ctl = null;
        ctl = (MyBaseControl) Assembly.GetExecutingAssembly().CreateInstance(typeof(MyBaseControl).Namespace + "." + NameOfControl);
    }

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

Ответ 2 · рейтинг 1 · Erich

Лучший способ сделать это - загрузить тип через отражение. Поскольку все они находятся в одной сборке / пространстве имен, вы можете это сделать. В противном случае вам придется загружать сборку отдельно. Кроме того, предполагается, что конструктор пустой.

MyBaseControl ctl = null;
ctl = (MyBaseControl) typeof(MyBaseControl).assembly.GetType(NameOfControl).GetConstructor(new Type[0]).Invoke(new object[0]);

Если конструктор не пустой, измените массивы типа / объекта.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы