1

我试图寻找答案,但找不到,最接近的是:Create an instance of a class from a string但它并没有真正回答我的问题:

如何从字符串创建类的实例,例如,我想创建一个 WinForms 对象并将其添加到 MDI。

我有一个函数,它接受一个字符串,formname(例如“Form1”),并检查一个实例的 MDI 子级,如果它存在则设置焦点,如果不存在则创建一个实例并将其添加到子级。

我目前创建表单的方式是使用案例声明,但每次向项目添加新表单时,我都必须更新它!有没有办法根据传入的字符串向 MDI 子项添加 Form 类的实例,例如伪代码:

调用函数:openForm("Form2");

public void openForm(String formname)
{
    if form exists in MDI children
    {
         focus form with name = formname;
    }
    else
    {
        MDIChildren.add(CreateInstanceOfClassNamed(formname));
    }
}
4

3 回答 3

1

尝试这样的事情(伪代码,不知道 MDI 的东西)

public void openForm(String formTypeName)
{
    Form FocusForm = null;
    Type formType = Type.GetType(formTypeName);
    foreach (var form in MDIChildren) 
    {
        if (form.GetType() == formType)
        {
             focusForm = form;
             break;
        }
    }
    if (focusForm == null)
    {
        MDIChildren.add(Activator.CreateInstance(formType));
    }
    // set focus to focusForm
}
于 2012-10-23T14:26:50.740 回答
0

Activator可以从类名创建对象:

  object obj = Activator.CreateInstance(Type.GetType(assemblyname + "." +formname));

  ((Form)obj).ShowDialog();
于 2012-10-23T14:31:28.447 回答
0

而不是传递一个字符串,你可以只使函数通用:

public TForm GetForm<TForm>()
  where TForm : Form, new()
{
  TForm existingChild = MDIChildren.OfType<TForm>().FirstOrDefult();
  if(existingChild != null)
  {
    //focus, or do whatever
    return existingChild;
  }
  else
  {
    TForm newChild = new TForm();
    //do stuff with new child
    return newChild; 
  }
}

这将确保您不会传递不是表单或根本不是任何类型的类的字符串值。你可以这样称呼它:

Form2 newChild = GetForm<Form2>();
于 2012-10-23T14:39:50.357 回答