C# - 使用泛型类型的方法的实现

时间:2013-02-01 08:41:27

标签: c# winforms generics

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

因为我需要在几个不同的地方使用它,所以我创建了一个新类,其中所有需要此功能的类都继承。我想让它适用于泛型类型,所以我可以传递我可能需要的每个表单类,如LoadAForm(MyForm1)LoadAForm(MyForm2)等等。我希望我很清楚我想要的最终结果。< / p>

我试过了:

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&lt;&gt;`必须采用与我正在调用的表单类型相同类型的参数。

2 个答案:

答案 0 :(得分:5)

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

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

另外,为了确保T有效(正如您的comment建议的那样),您需要限制它:

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

答案 1 :(得分: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();
    }
}