通用函数问题 - 无法将类型'System.Web.UI.Control'转换为'T'

时间:2012-04-11 08:05:55

标签: c# asp.net

似乎我仍然没有“得到”泛型......我想要一个通用函数来加载一个本身调用Page.LoadControl()的用户控件,但是在尝试使它工作时我得到了上面的错误。 / p>

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

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的类型我试图将此函数的结果赋给并且能够将结果转换为该类型。

2 个答案:

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

答案 1 :(得分:2)

我认为您只需要将通用功能约束到Control,否则T对于您的目的而言过于通用。

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

修改

你可以做到这一点,但我不确定它是否比Daniel Hilgarth's answer中的非通用方法更加复杂。

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);