Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 泛型函数问题-无法转换类型';System.Web.UI.Control';至';T';_C#_Asp.net - Fatal编程技术网

C# 泛型函数问题-无法转换类型';System.Web.UI.Control';至';T';

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

看来我还是不懂泛型。。。我需要一个通用函数来加载一个用户控件,该控件本身调用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));
}
内部静态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个,这将使一个普通函数没有意义,如果它不能返回实际的类型。