1

を作成してMDI formおり、さまざまなフォームをロードするメソッドがあります。次に、少し変更を加える必要があります。ある子フォームを別の子フォーム内から呼び出す機能を追加する必要があります。

いくつかの異なる場所でこれが必要なので、この機能を必要とするすべてのクラスが継承する新しいクラスを作成しました。ジェネリック型で機能させたいので、必要なフォームクラスなどをすべて渡すことができます。最終結果として何が欲しいLoadAForm(MyForm1)LoadAForm(MyForm2)が明確になることを願っています。

私はこれを試しました:

protected void LoadAForm<T>(ref T sender)
{
    MainForm frm = this.MdiParent as MainForm;
    T temp;
    if (frm != null)
    {
        sender  = SingletonFormProvider.GetInstance<temp>(frm, true);
        sender.MdiParent = frm;
        sender.Dock = DockStyle.Fill;
        sender.Show();
    }
}

これは機能しません。しかし、ジェネリックがメソッドで使用されている場合は、ジェネリックの経験がほとんどないため、どうすればよいかわかりません。

この構文を使用してエラーとして表示されるのは、The type or namespace "temp" could not be found...". I'm not even sure that this is the way to do it.GetInstance<>` は呼び出しているフォームの型と同じ型の引数を取る必要があるということです。

4

2 に答える 2

5

変数名ではなく、パラメーターを使用する必要があります。

sender = SingletonFormProvider.GetInstance<T>(frm, true);

また、それTが有効であることを確認するには(コメントが示唆するように)、それを制約する必要があります:

protected void LoadAForm<T>(ref T sender) where T : Form
于 2013-02-01T08:43:27.053 に答える
1

ここではジェネリックは必要ないと思います。Form具体的なタイプとして使用するだけで、作業が簡単になると思います。

protected void LoadAForm(ref Form sender)
{
    MainForm frm = this.MdiParent as MainForm;
    Form temp;
    if (frm != null)
    {
        sender  = SingletonFormProvider.GetInstance(frm, true);
        sender.MdiParent = frm;
        sender.Dock = DockStyle.Fill;
        sender.Show();
    }
}
于 2013-02-01T08:47:46.037 に答える