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

我将各种对象传递给一个子例程来运行相同的进程,但每次使用不同的对象。例如,在一种情况下,我使用 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
156509 次浏览

在 VB.NET 中,需要使用 GetType检索对象的实例类型,使用 GetType()接线员检索另一个已知类型的类型。

一旦有了这两种类型,就可以简单地使用 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接线员而不是 GetType方法。请注意,这将测试对象是否为具有给定类型的 兼容,而不是测试它是否为相同类型。看起来像这样:

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


End If

Totally trivial, irrelevant nitpick: Traditionally, the names of parameters are camelCased (which means they always start with a lower-case letter) when writing .NET code (either VB.NET or C#). This makes them easy to distinguish at a glance from classes, types, methods, etc.

关于 Cody Gray 的反应,还有一些细节。由于我花了一些时间来消化它,我认为它可能对其他人有用。

首先,一些定义:

  1. 有 TypeNames,它是对象类型、接口等的字符串表示形式。例如,BarPublic Class BarDim Foo as Bar中的 TypeName。TypeNames 可以看作是代码中使用的“标签”,用于告诉编译器在字典中查找哪个类型定义,其中将描述所有可用的类型。
  2. There are System.Type objects which contain a value. This value indicates a type; just like a String would take some text or an Int would take a number, except we are storing types instead of text or numbers. Type objects contain the type definitions, as well as its corresponding TypeName.

第二,理论:

  1. Foo.GetType()返回一个 Type对象,该对象包含变量 Foo的类型。换句话说,它告诉您 Foo是什么样的实例。
  2. GetType(Bar)返回一个 Type对象,其中包含 TypeName Bar的类型。
  3. 在某些情况下,对象的 Cast类型与首次实例化对象的类型不同。在下面的示例中,MyObj 是一个转换为 ObjectInteger:

    Dim MyVal 作为整数 = 42 Dim MyObj As Object = CType(MyVal, Object)

So, is MyObj of type Object or of type Integer? MyObj.GetType() will tell you it is an Integer.

  1. 但是现在有了 Type Of Foo Is Bar特性,它允许您确定变量 Foo与 TypeName Bar兼容。Type Of MyObj Is IntegerType Of MyObj Is Object都将返回 True。在大多数情况下,如果变量是 TypeName 的类型或从中派生的 Type,TypeOf 将指示变量与 TypeName 兼容。 更多信息请点击这里: < a href = “ https://Learn.microsoft.com/en-us/dotnet/Visual-basic/language-reference/Operator/typeof-Operator # comments”rel = “ nofollow noReferrer”> https://learn.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

EDIT

还可以使用 Information.TypeName(Object)获取给定对象的 TypeName,

Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"