C# 泛型函数问题-无法转换类型';System.Web.UI.Control';至';T';
看来我还是不懂泛型。。。我需要一个通用函数来加载一个用户控件,该控件本身调用Page.LoadControl(),但在尝试使其工作时,我遇到了上述错误 下面是我用来加载控件的代码的模型:C# 泛型函数问题-无法转换类型';System.Web.UI.Control';至';T';,c#,asp.net,C#,Asp.net,看来我还是不懂泛型。。。我需要一个通用函数来加载一个用户控件,该控件本身调用Page.LoadControl(),但在尝试使其工作时,我遇到了上述错误 下面是我用来加载控件的代码的模型: MyControl Ctrl = MyUtilClass.LoadControl(Page, "MyControl"); 然后在MyUtilClass中: internal static T LoadControl<T>(Page P, string ControlName) { retu
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));
}
内部静态T加载控制(第P页,字符串控制名称)
{
返回(T)P.LoadControl(String.Format(“~/{0}{1}.ascx”,WebGlobals.cControlDir,ControlName));
}
我显然做错了什么,但我的理解是,编译器会查看我试图将此函数的结果分配给的var类型,并能够将结果转换为该类型。我认为您需要将泛型函数约束为
控件
s,否则,T
对于您的目的来说太通用了
internal static T LoadControl<T>(Page P, string ControlName)
where T : System.Web.UI.Control
{
...
}
我认为您需要将泛型函数仅限制为
Control
s,否则T
对于您的目的来说太泛型了
internal static T LoadControl<T>(Page P, string ControlName)
where T : System.Web.UI.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));
}
这不需要泛型。只需让您的方法返回
控件
:
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));
}
好的,很好,这对初始问题进行了排序,但我现在得到的
方法“MyUtilClass.LoadControl(System.Web.UI.Page,string)”的类型参数无法从用法中推断出来。尝试显式指定类型参数。
@webnoob,调用的receiving变量是如何声明的,带有var
?@Jodrell:这不相关。泛型参数类型不是从返回值分配给的变量类型推断出来的。@webnoob,您需要使用尖括号显式传递类型,
@webnoob,Daniel Hilgarth回答中的非泛型方法应该被认为是很好的,这对初始问题进行了排序,但我现在得到的方法“MyUtilClass.LoadControl(System.Web.UI.Page,string)”的类型参数无法从用法中推断出来。尝试显式指定类型参数。
@webnoob,调用的receiving变量是如何声明的,带有var
?@Jodrell:这不相关。泛型参数类型不是从返回值分配给的变量类型推断出来的。@webnoob,您需要使用尖括号显式传递类型,
@webnoob,这里应该考虑Daniel Hilgarth回答中的非泛型方法MyUtilClass.LoadControl(…)
本身就是一个有效的语句(它会丢弃返回值)(如果它不是泛型方法…)。它如何从中计算出T?调用时需要指定T,MyUtilClass.LoadControl(…)
MyUtilClass.LoadControl(…)
本身就是一个有效的语句(它会丢弃返回值)(如果它不是泛型方法…)。它如何从中计算出T?调用时需要指定T,MyUtilClass.LoadControl(…)
,但我希望结果是MyControl
,它本身就是一个继承了脱离控制的类public部分类MyControl:System.Web.UI.UserControl
所有控件都是Control
s(+1顺便说一下)@webnoob:在这种情况下,让方法返回MyControl
,并将P.LoadControl
的结果强制转换为MyControl
,请参阅更新。仍然没有理由使用泛型方法。@Jodrell-是的,但我将发布针对MyControl的特定属性,在加载控件后,我将访问这些属性,并试图避免每次加载控件时强制转换。@DanielHilgarth-我不仅仅有一个控件。一旦这完成,我将有100个,这将使一个普通函数没有意义,如果它不能返回实际的类型。但我希望结果是MyControl
,这是一个类本身继承了脱离控制public部分类MyControl:System.Web.UI.UserControl
所有控件都是Control
s(+1顺便说一下)@webnoob:在这种情况下,让方法返回MyControl
,并将P.LoadControl
的结果强制转换为MyControl
,请参阅更新。仍然没有理由使用泛型方法。@Jodrell-是的,但我将发布针对MyControl的特定属性,在加载控件后,我将访问这些属性,并试图避免每次加载控件时强制转换。@DanielHilgarth-我不仅仅有一个控件。一旦完成,我将有100个,这将使一个普通函数没有意义,如果它不能返回实际的类型。