รายละเอียดเพิ่มเติมบางส่วนที่เกี่ยวข้องกับการตอบสนองจาก Cody Gray ในขณะที่ฉันใช้เวลาพอสมควรในการย่อยมันฉันแม้ว่ามันอาจจะเป็นประโยชน์สำหรับคนอื่น
ประการแรกคำจำกัดความบางประการ:
- มี TypeNames ซึ่งเป็นตัวแทนสตริงของประเภทของวัตถุอินเตอร์เฟซ ฯลฯ ตัวอย่างเช่นที่มี
Bar
เป็น TypeName ในหรือในPublic Class Bar
Dim Foo as Bar
TypeNames อาจถูกมองว่าเป็น "เลเบล" ที่ใช้ในโค้ดเพื่อบอกคอมไพเลอร์ว่าต้องการค้นหานิยามประเภทใดในพจนานุกรมซึ่งจะมีการอธิบายประเภทที่มีอยู่ทั้งหมด
- มี
System.Type
วัตถุที่มีค่า ค่านี้ระบุประเภท เช่นเดียวกับที่String
จะใช้ข้อความบางส่วนหรือInt
จะใช้ตัวเลขยกเว้นเรากำลังจัดเก็บประเภทแทนข้อความหรือตัวเลข Type
ออบเจ็กต์มีนิยามประเภทรวมถึง TypeName ที่สอดคล้องกัน
ประการที่สองทฤษฎี:
Foo.GetType()
ส่งกลับวัตถุซึ่งมีชนิดสำหรับตัวแปรType
Foo
กล่าวอีกนัยหนึ่งก็คือจะบอกคุณว่าอะไรFoo
คือตัวอย่างของ
GetType(Bar)
ส่งกลับType
วัตถุซึ่งมีชนิดสำหรับ Bar
TypeName
ในบางกรณีประเภทของวัตถุ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
เข้ากันได้กับ Bar
TypeName Type Of MyObj Is Integer
และ Type Of MyObj Is Object
ทั้งคู่จะคืนค่า True สำหรับกรณีส่วนใหญ่ TypeOf จะระบุว่าตัวแปรเข้ากันได้กับ TypeName ถ้าตัวแปรนั้นเป็น Type นั้นหรือ Type ที่มาจากตัวแปรนั้น ข้อมูลเพิ่มเติมที่นี่: 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)
Debug.Print(MyValDble.GetType.ToString)
Debug.Print(MyObj.GetType.ToString)
Debug.Print(MyValInt.GetType.GetType.ToString)
Debug.Print(MyValDble.GetType.GetType.ToString)
Debug.Print(MyObj.GetType.GetType.ToString)
Debug.Print(GetType(Integer).GetType.ToString)
Debug.Print(GetType(Double).GetType.ToString)
Debug.Print(GetType(Object).GetType.ToString)
Debug.Print(MyValInt.GetType = GetType(Integer))
Debug.Print(MyValInt.GetType = GetType(Double))
Debug.Print(MyValInt.GetType = GetType(Object))
Debug.Print(MyValDble.GetType = GetType(Integer))
Debug.Print(MyValDble.GetType = GetType(Double))
Debug.Print(MyValDble.GetType = GetType(Object))
Debug.Print(MyObj.GetType = GetType(Integer))
Debug.Print(MyObj.GetType = GetType(Double))
Debug.Print(MyObj.GetType = GetType(Object))
Debug.Print(TypeOf MyObj Is Integer)
Debug.Print(TypeOf MyObj Is Double)
Debug.Print(TypeOf MyObj Is Object)
End Sub
แก้ไข
คุณยังสามารถใช้Information.TypeName(Object)
เพื่อรับ TypeName ของวัตถุที่กำหนด ตัวอย่างเช่น,
Dim Foo as Bar
Dim Result as String
Result = TypeName(Foo)
Debug.Print(Result)