我写了这段代码:
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
(问题更为笼统,我可能需要这适用于不同的脚本或其他地方)。 TagName
是System.Web.UI.HtmlControls.HtmlControl的字段。我的测试用例中的0' control
返回
{Name = "HtmlHead" FullName = "System.Web.UI.HtmlControls.HtmlHead"}
<{1>} control.GetType
。如果我们查看System.Web.UI.HtmlControls.HtmlHead,我们会看到它继承System.Web.UI.HtmlControls.HtmlGenericControl,而System.Web.UI.HtmlControls.HtmlContainerControl继承TagName,继承自HtmlControl
。由于{{3}}为Public
,我希望control.GetType.GetField("TagName")
为Return
"head"
。而不是那样,它返回Nothing
。我想知道这种行为的原因是什么?
编辑:
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)
它是属性而不是字段。使用
而是{p>Dim result = propInfo .GetValue(control, Nothing)
。
这将返回一个PropertyInfo对象。要获得实际值,请使用
{{1}}