Еще несколько подробностей в связи с ответом Коди Грей.Поскольку мне потребовалось некоторое время, чтобы переварить это, я подумал, что это может быть полезно для других.
Во-первых, некоторые определения:
- Существуют TypeNames, которые являются строковыми представлениями типаобъект, интерфейс и т. д. Например,
Bar
является TypeName в Public Class Bar
или в Dim Foo as Bar
.TypeNames можно рассматривать как «метки», используемые в коде, чтобы указать компилятору, какое определение типа искать в словаре, где будут описаны все доступные типы. System.Type
объекты, которые содержат значение.Это значение указывает тип;точно так же, как String
будет принимать текст или Int
будет принимать число, за исключением того, что мы храним типы вместо текста или чисел.Type
объекты содержат определения типов, а также соответствующее имя типа.
Во-вторых, теория:
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/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"