![](/img/trans.png)
[英]Cannot implicitly convert type 'System.Web.UI.Control' to 'System.Web.UI.UserControl
[英]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.