有关Cody Gray的回复的更多详细信息。我花了一些时间来消化它,尽管它可能对其他人有用。
首先,一些定义:
- 有TypeName,它们是对象,接口等的类型的字符串表示形式。例如,
Bar
在Public Class Bar
中或中是TypeName Dim Foo as Bar
。TypeNames可以看作是代码中的“标签”,用于告诉编译器要在字典中查找将描述所有可用类型的类型定义。
- 有些
System.Type
对象包含一个值。该值表示类型;就像a String
会接受一些文本或a Int
会接受数字一样,只是我们存储的是类型而不是文本或数字。Type
对象包含类型定义及其对应的TypeName。
二,理论:
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。在大多数情况下,如果变量属于该类型或从其派生的类型,则TypeOf将指示该变量与TypeName兼容。此处的更多信息:https : //docs.microsoft.com/zh-cn/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
编辑
您还可以使用Information.TypeName(Object)
获取给定对象的TypeName。例如,
Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result) 'Will display "Bar"