2016-08-08 2 views
-1

Я написал этот код:Как получить TagName элемента управления, если существует?

If (AlohaEnabled) Then 
     Dim head As Control = Nothing 
     For Each control In Master.Controls 
      Dim field = control.GetType.GetField("TagName") 
      If ((field IsNot Nothing) AndAlso (field.GetValue(control).Equals("head"))) Then 
       'Add aloha scripts 
      End If 
     Next 
    End If 

Если AlohaEnabled является True, то я намерен добавить некоторые ссылки и скрипты для head тега. Я не знаю заранее, какой тип Master будет использован, поэтому я повторяю его Controls и ищите поле под названием TagName через отражение. Если field имеет значение, то я сравниваю его с "head", и если это совпадение, то я намерен добавить aloha script s (вопрос более общий, хотя мне это может понадобиться для разных скриптов, а также где-то еще). TagName - область System.Web.UI.HtmlControls.HtmlControl. в моем тестовом случае 0'th control возвращает

{Name = "HtmlHead" FullName = "System.Web.UI.HtmlControls.HtmlHead"} 

на control.GetType. Если посмотреть на System.Web.UI.HtmlControls.HtmlHead, мы увидим, что он наследует System.Web.UI.HtmlControls.HtmlGenericControl, который на свой черед наследует System.Web.UI.HtmlControls.HtmlContainerControl, который наследует от HtmlControl. Поскольку TagName является Public, я ожидал бы control.GetType.GetField("TagName") до Return"head". Вместо этого он возвращает Nothing. Интересно, в чем причина такого поведения?

EDIT:

FloatingKiwi правильно, проблема заключалась в том, что я искал поле, но это свойство, поэтому я не нашел (какова цель свойств в любом случае, мы можем решать свои задачи с помощью методов). Я использовал работу вокруг в то же время:

 For Each control In Master.Controls 
      If (TypeOf control Is System.Web.UI.HtmlControls.HtmlControl) Then 
       Dim htmlControl = CType(control, System.Web.UI.HtmlControls.HtmlControl) 
       If (htmlControl.TagName.Equals("head")) Then 
        'Add aloha scripts 
       End If 
      End If 
     Next 

Интересно, это лучшее решение: моя работа вокруг, или свойство поиска с помощью отражения?

+0

Я заметил, что этот вопрос вниз проголосовали. Если кто-то может объяснить проблему с вопросом, я могу отредактировать ее, чтобы улучшить ее качество или удалить ее, если она невосприимчива. –

ответ

1

Это свойство не поле. Использовать

Dim propInfo = control.GetType.GetProperty("TagName") вместо этого.

Это вернет объект PropertyInfo. Для того, чтобы получить фактическое значение использования

Dim result = propInfo .GetValue(control, Nothing)

+0

control.GetType.GetProperty («TagName»). GetValue (control, Nothing) решает проблему действительно, но If (TypeOf control Is System.Web.UI.HtmlControls.HtmlControl) Затем Dim htmlControl = CType (control, System.Web .UI.HtmlControls.HtmlControl) также хорошо работает. Интересно, какой код лучше, фактический ответ на мой вопрос или обход, который я реализовал вместо этого. –

+0

Пожалуйста, взгляните на вопрос, который был отредактирован. Как вы можете видеть, я реализовал обход и задаюсь вопросом, лучше или хуже это решение, которое вы показали (что является ответом на вопрос). –

+1

Лучше всего использовать строго типизированный подход, а не использовать отражение. – FloatingKiwi

Смежные вопросы