似乎我仍然没有“得到”泛型......我想要一个通用函数来加载一个本身调用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的类型我试图将此函数的结果赋给并且能够将结果转换为该类型。
答案 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);