我将各种对象传递给子例程以运行相同的进程,但每次都使用不同的对象。例如,在一种情况下,我使用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
答案 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的回复有关的更多详细信息。我花了一些时间来消化它,尽管它可能对其他人有用。
首先,一些定义:
Bar
是Public Class Bar
或Dim Foo as Bar
中的TypeName。Type
个对象包含一个值。该值表示类型;就像String
会接受一些文本或Int
会接受数字一样,除了我们存储的是类型而不是文本或数字。第二,理论:
Foo.GetType()
返回一个Type
对象,其中包含变量Foo
的类型。换句话说,它告诉您Foo
是什么实例。GetType(Bar)
返回一个Type
对象,其中包含TypeName Bar
的类型。在某些情况下,对象Cast
的类型与对象最初实例化的类型不同。在以下示例中,MyObj是将Integer
强制转换为Object
:
Dim MyVal As Integer = 42
Dim MyObj As Object = CType(MyVal, Object)
那么MyObj
是Object
类型还是Integer
类型? MyObj.GetType()
会告诉您它是Integer
。
Type Of Foo Is Bar
功能来了,它使您可以确定变量Foo
与TypeName Bar
兼容。 Type Of MyObj Is Integer
和Type 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