有人知道我如何在共享/静态函数内部动态加载控件吗?该函数本身在mustinherit / abstract类中。 (这是VB中的ASP.NET项目)我想做这样的事情:
VB:

    Public Shared Function GetWidget(ByVal name As WidgetName) As Control
        Select Case name
            Case WidgetName.Name1
                Return LoadControl("~/Control1.ascx")
            Case WidgetName.Name2
                Return LoadControl("~/Control2.ascx")
            Case WidgetName.Name3
                Return LoadControl("~/Control3.ascx")
        End Select
    End Function


我的C#有点生锈,因此可能存在一些语法错误:

Public Static Control GetWidget(WidgetName name)
{
    switch (name)
    {
        Case WidgetName.Name1:
            return LoadControl("~/Control1.ascx");
            break;
        Case WidgetName.Name2:
            return LoadControl("~/Control2.ascx");
            break;
        Case WidgetName.Name3:
            return LoadControl("~/Control3.ascx");
            break;
    }
}


(其中WidgetName是枚举数。)

我收到“如果没有该类的显式实例,则无法从共享方法或共享成员初始化程序中引用该类的实例成员。”但我不理解此错误。我理解它的意思,我只是不明白为什么编译器未将调用LoadControl视为类的显式实例。使用LoadControl从文件创建新控件有什么不明显的地方?我尝试创建一个新的用户控件并对其进行初始化,然后将其设置为另一个控件,而LoadControl无效。我也不想执行DirectCast,因为我试图将其放入共享的mustinheret(抽象)类中,因此该类没有.aspx文件要写入<%@ Reference Control="~/SomeControlPath.ascx" %>中,因此该类名不可用。

我想做的是编写一个静态函数,该函数需要一些值并仅基于该控件的源文件位置返回一个控件。最终结果是用户可修改的控件列表。他们会得到一列控件,它们可以根据我指定的可用子控件的静态列表自由添加,删除或重新排序。我不喜欢这种方法。在很多方面,它可能真的是错误的。

是的,我知道其中存在静态字符串,但实际上没有代码味道;为了提出问题,这是一种简化。

欢迎使用C#,VB或简单的英语说明。

最佳答案

是因为无法从类中返回LoadControl吗?你能试试看吗...

    Protected Static string GetWidget(WidgetName name)
    {
        switch (name)
        {
            Case WidgetName.Name1:
                return "~/Control1.ascx";
                break;
            Case WidgetName.Name2:
                return "~/Control2.ascx";
                break;
            Case WidgetName.Name3:
                return"~/Control3.ascx";
                break;
      }
 }


并像这样调用方法

... = LoadControl(GetWidget(name));


我怀疑另一种选择是投放控制

Control c;
...
Case ...
   c = (ControlName)LoadControl("~/Control1/.ascx");
   break;
...
return c;


但是,调用代码仍然需要将其强制转换回其类型...

08-03 14:46