如何检查对象是否是某种类型

时间:2011-07-05 08:48:02

标签: .net vb.net object drop-down-menu object-type

我将各种对象传递给子例程以运行相同的进程,但每次都使用不同的对象。例如,在一种情况下,我使用ListView,在另一种情况下,我传递DropDownList。

我想检查传递的对象是否是DropDownList,然后执行一些代码。我该怎么做?

到目前为止,我的代码不起作用:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj Is System.Web.UI.WebControls.DropDownList Then

    End If
    Obj.DataBind()
End Sub

2 个答案:

答案 0 :(得分:139)

在VB.NET中,您需要使用GetType method来检索对象实例的类型,并使用GetType() operator来检索另一种已知类型的类型。

一旦有了这两种类型,您只需使用Is运算符进行比较即可。

所以你的代码实际上应该是这样编写的:

Sub FillCategories(ByVal Obj As Object)
    Dim cmd As New SqlCommand("sp_Resources_Categories", Conn)
    cmd.CommandType = CommandType.StoredProcedure
    Obj.DataSource = cmd.ExecuteReader
    If Obj.GetType() Is GetType(System.Web.UI.WebControls.DropDownList) Then

    End If
    Obj.DataBind()
End Sub

您还可以使用TypeOf operator代替GetType方法。请注意,如果您的对象与给定类型的兼容,则不会测试它是否为同一类型。这看起来像这样:

If TypeOf Obj Is System.Web.UI.WebControls.DropDownList Then

End If

完全琐碎,无关紧要的挑剔:传统上,在编写.NET代码(VB.NET或C#)时,参数的名称是camelCased(这意味着它们总是以小写字母开头) 。这使得它们很容易一目了然地与类,类型,方法等区分开来。

答案 1 :(得分:0)

与Cody Gray的回复有关的更多详细信息。我花了一些时间来消化它,尽管它可能对其他人有用。

首先,一些定义:

  1. 在代码中使用了TypeName。例如,BarPublic Class BarDim Foo as Bar中的TypeName。
  2. Type个对象包含一个值。该值表示类型;就像String会接受一些文本或Int会接受数字一样,除了我们存储的是类型而不是文本或数字。

第二,理论:

  1. Foo.GetType()返回一个Type对象,其中包含变量Foo的类型。换句话说,它告诉您Foo是什么实例。
  2. GetType(Bar)返回一个Type对象,其中包含TypeName Bar的类型。
  3. 在某些情况下,对象Cast的类型与对象最初实例化的类型不同。在以下示例中,MyObj是将Integer强制转换为Object

    Dim MyVal As Integer = 42 Dim MyObj As Object = CType(MyVal, Object)

那么MyObjObject类型还是Integer类型? MyObj.GetType()会告诉您它是Integer

  1. 但是Type Of Foo Is Bar功能来了,它使您可以确定变量Foo与TypeName Bar兼容。 Type Of MyObj Is IntegerType Of MyObj Is Object都将返回True。在大多数情况下,如果变量属于该Type或派生自该Type的Type,TypeOf将指示该变量与TypeName兼容。 此处更多信息:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/typeof-operator#remarks

下面的测试很好地说明了每个提到的关键字和属性的行为和用法。

Public Sub TestMethod1()

    Dim MyValInt As Integer = 42
    Dim MyValDble As Double = CType(MyValInt, Double)
    Dim MyObj As Object = CType(MyValDble, Object)

    Debug.Print(MyValInt.GetType.ToString) 'Returns System.Int32
    Debug.Print(MyValDble.GetType.ToString) 'Returns System.Double
    Debug.Print(MyObj.GetType.ToString) 'Returns System.Double

    Debug.Print(MyValInt.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyValDble.GetType.GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(MyObj.GetType.GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(GetType(Integer).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Double).GetType.ToString) 'Returns System.RuntimeType
    Debug.Print(GetType(Object).GetType.ToString) 'Returns System.RuntimeType

    Debug.Print(MyValInt.GetType = GetType(Integer)) '# Returns True
    Debug.Print(MyValInt.GetType = GetType(Double)) 'Returns False
    Debug.Print(MyValInt.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyValDble.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyValDble.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyValDble.GetType = GetType(Object)) 'Returns False

    Debug.Print(MyObj.GetType = GetType(Integer)) 'Returns False
    Debug.Print(MyObj.GetType = GetType(Double)) '# Returns True
    Debug.Print(MyObj.GetType = GetType(Object)) 'Returns False

    Debug.Print(TypeOf MyObj Is Integer) 'Returns False
    Debug.Print(TypeOf MyObj Is Double) '# Returns True
    Debug.Print(TypeOf MyObj Is Object) '# Returns True


End Sub