繁体   English   中英

通用 function 问题 - 无法将类型“System.Web.UI.Control”转换为“T”

[英]Generic function issue - Cannot convert type 'System.Web.UI.Control' to 'T'

看来我仍然没有“得到”generics ...我想要一个通用的 function 来加载一个固有调用 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));
}

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

为此,您不需要 generics。 只需让您的方法返回Control

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

如果你把这个方法放在一个 static class 中,你可以把它做成一个扩展方法,注意方法第一个参数前的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));
}

我认为您需要将通用 function 限制为仅Control s,否则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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM