如何确定是否存在类成员?

时间:2015-07-23 14:40:01

标签: vb.net class variables

我有一个由许多类调用的公共子例程。但是,我现在需要在该子例程中执行某些操作,该子例程仅适用于调用它的少量类。因此,我不想返回并将属性添加到所有现有类,我只想检查以查看该类是否具有该属性,如果是,则使用它执行某些操作。但我似乎无法弄清楚如何在不出错的情况下简单地检查成员是否存在。

例如:

Public Class_1

     Public a1 as string = ""

   Public Sub New()
       ' when a button is clicked call subroutine "check()"
   End Sub

End Class

Public Class_2

     Public a1 as string = ""
     Public a2 as integer = 0

   Public Sub New()
       ' when a button is clicked call subroutine "check()"
   End Sub

End Class

Public Class whatever

    Public Sub check(sender as object)
       If sender.a2 = 0 then
       ' do something
       End if
    End Sub

End Class

我尝试过

这样的事情
If not(sender.a2 is nothing) then
If isnothing(sender.a2) then

但我无法通过简单地使用" sender.a2"来解决我的错误。因为a2并不总是发件人的成员。

如何在不使用" sender.a2"的情况下检查a2是否是发送类的成员?

2 个答案:

答案 0 :(得分:2)

如果你想看到一个字段存在,你需要这个:

Dim fi As FieldInfo = sender.GetType().GetField("nameOfFieldHere")
If fi IsNot Nothing
   'field exists now get the value
    Dim o As Object = fi.GetValue(sender)
End If

查看文档Type.GetField Method (String) 也有重载。

答案 1 :(得分:0)

在尝试使用之前,您可以测试您引用的对象是否属于某种类型。一旦您确定它是正确的类型,您可以安全地转换为它,然后使用正确的属性,如下所示:

If (TypeOf sender Is Class_2) Then
  Dim castObj As Class_2 = CType(sender, Class_2)
  'We can now access castObj.a2
End If

如果有多个具有该属性的类,那么创建一个表明它们具有a2属性并让它们都实现它的接口是明智的。然后,您可以针对新接口而不是Class_2测试其类型。

另一种选择是使用类继承为所有类实现默认的公共方法,并在您的子类的特殊Class_2案例中覆盖它。