LoadControl в статической/общей функции

Кто-либо знает, как я могу динамично загрузить управление в общей/статичной функции? Сама функция в mustinherit/abstract классе. (Это - проект ASP.NET в VB), я хочу сделать что-то вроде этого:
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 файла для записи в a <%@ Reference Control="~/SomeControlPath.ascx" %>, таким образом, имя класса недоступно.

То, что я пытаюсь сделать, записать статическую функцию, которая принимает некоторое значение и возвращает управление, базирующееся только на местоположении исходного файла того управления. Конечным результатом является модифицируемый пользователем список средств управления. Они получают столбец средств управления, которые они свободно добавляют, удаляют, или переупорядочивание на основе статического списка доступных дочерних элементов управления, которые я указываю. Я не женат на этом подходе; это могло бы быть действительно неправильно большим количеством способов, чем один.

да, я знаю статические строки, являющиеся существует запах кода, он не на самом деле похож на это; это - упрощение ради задавания вопроса.

C#, VB или простые английские объяснения все приветствие.

5
задан jorelli 30 December 2009 в 17:24
поделиться

2 ответа

Это потому, что 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;

Однако вызывающему коду все равно придется привести его обратно к своему типу...

0
ответ дан 18 December 2019 в 14:47
поделиться

LoadControl является методом экземпляра класса TemplateControl, от которого наследуется класс Page, и у вас нет экземпляра класса Page внутри вашего метода статического (нет объекта this, так как это статический метод).

1
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: