0

看来我仍然没有“获得”泛型......我想要一个通用函数来加载一个固有地调用 Page.LoadControl() 的用户控件,但是在尝试使其工作时出现上述错误。

这是我用来加载控件的代码模型:

MyControl Ctrl = MyUtilClass.LoadControl(Page, "MyControl");

然后在 MyUtilClass 中:

internal static T LoadControl<T>(Page P, string ControlName)
{
    return (T)P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir, ControlName));
}

我显然做错了,但我的理解是编译器会查看我试图将此函数的结果分配给的 var 类型,并能够将结果转换为该类型。

4

2 回答 2

3

你不需要泛型。只需让您的方法返回Control

internal static System.Web.UI.Control LoadControl(Page P, string ControlName)
{
    return P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir,
                                                        ControlName));
}

如果你把这个方法放在一个静态类中,你可以用它做一个扩展方法,注意方法this的第一个参数之前:

internal static System.Web.UI.Control LoadControl(this Page P, string ControlName)
{
    return P.LoadControl(String.Format("~/{0}{1}.ascx", WebGlobals.cControlDir, 
                                                        ControlName));
}

你现在可以这样称呼它:

var control = yourPage.LoadControl(controlName);

如果您真的想要一个MyControl实例,请将方法更改为:

internal static MyControl LoadControl(this Page P, string ControlName)
{
    return (MyControl)P.LoadControl(String.Format("~/{0}{1}.ascx", 
                                    WebGlobals.cControlDir, 
                                    ControlName));
}
于 2012-04-11T08:13:46.073 回答
2

我认为您只需要将通用函数限制为Controls,否则T对于您的目的来说太通用了。

internal static T LoadControl<T>(Page P, string ControlName)
    where T : System.Web.UI.Control
{
    ...
}

编辑

您可以这样做,但我不确定是否值得在Daniel Hilgarth 的回答中比非通用方法增加额外的复杂性。

internal static void LoadControl<T>(Page P, 
                                     string ControlName
                                     out T control)
    where T : System.Web.UI.Control
{
    control = (T)P.LoadControl(
                   String.Format("~/{0}{1}.ascx",
                                    WebGlobals.cControlDir, 
                                    ControlName));
}

像这样打电话

MyControl myControl;
LoadControl(page, "MyControl", myControl);
于 2012-04-11T08:11:31.140 回答