2015-04-02 87 views
2

好吧,某些遗传代码:我有权限的整个负载的结构:访问VB.Net结构元素

public structure Perms 
    dim writeStaff as Boolean 
    dim readStaff as Boolean 
    dim writeSupervisor as Boolean 
    dim readSuperVisor as Boolean 
    ' ... and many more 
End Structure 

而且我希望有一个功能CANDO,我像这样创建:

public function canDo(p as Perms, whichOne as String) as boolean 
    Dim b as System.Reflection.FieldInfo 
    b = p.GetType().GetField(whichOne) 
    return b 
end function 

我打电话CANDO与预填充结构和“writeSupervisor”参数

在调试,b显示为{布尔writeSupervisor},但是当我试图返回b为布尔,我得到错误:值典型值e'System.Reflection.FieldInfo'不能转换为'布尔'。

任何想法如何可以通过元素名称和测试/比较/返回值“索引”到结构?

回答

3

您需要调用FieldInfo对象的GetValue方法来获取字段值。

Public Function canDo(p As Perms, whichOne As String) As Boolean 
    If (Not String.IsNullOrEmpty(whichOne)) Then 
     Dim info As FieldInfo = p.GetType().GetField(whichOne) 
     If (Not info Is Nothing) Then 
      Dim value As Object = info.GetValue(p) 
      If (TypeOf value Is Boolean) Then 
       Return DirectCast(value, Boolean) 
      End If 
     End If 
    End If 
    Return False 
End Function 

我也推荐你阅读这个:Visual Basic Naming Conventions

+0

工作了一个魅力,谢谢。命名:我只是在示例中填入任何旧名称。我不得不说,虽然info.GetValue(p),传递原始对象p作为参数,似乎非常直观。 – 2015-04-02 11:04:10

+0

太棒了!我明白你的意思,但你必须记住,字段信息对象是通过使用对象评估者的类型而不是对象的实例来创建的。所以'p.GetType()。GetField(whichOne)'和'GetType(Perms).GetField(whichOne)'是一样的。 – 2015-04-02 11:15:11