Вот сценарий. У меня есть несколько 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, включая их базовый класс, находятся в одном проекте и имеют одно и то же пространство имен.
Ответ 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]);
Если конструктор не пустой, измените массивы типа / объекта.