以下是该方案。我有一堆UserControls都继承自MyBaseControl。我想基于其名称实例化UserControl。例如:
void foo(string NameOfControl) {
MyBaseControl ctl = null;
ctl = CreateObject(NameOfControl); // I am making stuff up here,
// CreateObject does not exist
}
如何根据其名称实例化此UserControl。我可以有一个巨大的开关声明,闻起来很糟糕。所有UserControls,包括它们的Base类,都在同一个项目中,并且都具有相同的命名空间。
答案 0 :(得分:1)
执行此操作的最佳方法是通过反射加载类型。由于它们都在同一个程序集/命名空间中,因此您可以执行此操作。否则,您必须单独加载程序集。此外,它假定一个空的构造函数。
MyBaseControl ctl = null;
ctl = (MyBaseControl) typeof(MyBaseControl).assembly.GetType(NameOfControl).GetConstructor(new Type[0]).Invoke(new object[0]);
如果构造函数不是空的,请更改类型/对象数组。
答案 1 :(得分:1)
void foo(string NameOfControl)
{
MyBaseControl ctl = null;
ctl = (MyBaseControl) Assembly.GetExecutingAssembly().CreateInstance(typeof(MyBaseControl).Namespace + "." + NameOfControl);
}
上面假设您的每个派生控件类都是默认的无参数构造函数。