2013-02-01 42 views
1

我正在创建MDI form,我有一个加载不同表单的方法。现在我需要做一些修改 - 我需要添加从另一个子窗体中调用一个子窗体的功能。C# - 使用泛型类型的方法的实现

因为我需要这个在几个不同的地方,我从所有需要这个功能的类继承了一个新类。我想使它与泛型类型一起工作,这样我就可以传递我可能需要的所有表单类,如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 <>`必须采取与我打电话的形式类型相同的参数。

回答

5

您需要使用类型参数,而不是变量名:

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

此外,为了确保T是有效的(如您的comment建议),您将需要限制它:

protected void LoadAForm<T>(ref T sender) where T : Form 
+0

我试过,但得到这个错误'的类型T不能在泛型类型的方法被用作类型参数“T” .. 。没有从“T”到“System.Windows.Forms.Form”的装箱转换或类型参数转换。 – Leron

+0

@Lonon - 你需要在方法上添加一个类型约束,所以'T'只能从'Form'派生。 – Oded

+0

谢谢,问题解决了! – Leron

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(); 
    } 
} 
相关问题