1

これに対する答えを検索しようとしましたが、見つけられませんでした。最も近いものは次のとおりです。文字列からクラスのインスタンスを作成しますが、実際には私の質問には答えません:

文字列からクラスのインスタンスを作成するにはどうすればよいですか。たとえば、WinForms オブジェクトを作成して MDI に追加したいです。

文字列、フォーム名(「Form1」など)を受け入れ、インスタンスのMDI子をチェックする関数があります。存在する場合はフォーカスを設定し、そうでない場合はインスタンスを作成して子に追加します。

私が現在フォームを作成する方法は case ステートメントを使用していますが、プロジェクトに新しいフォームを追加するたびにこれを更新する必要があります! 渡された文字列に基づいて Form クラスのインスタンスを MDI の子に追加する方法はありますか?たとえば、疑似コード:

関数の呼び出し: 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 に答える