User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
ฉันจะทดสอบได้อย่างไรว่าตัวแปรบางตัวเป็นบางประเภทด้วยวิธีนี้
User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
ฉันจะทดสอบได้อย่างไรว่าตัวแปรบางตัวเป็นบางประเภทด้วยวิธีนี้
คำตอบ:
คำตอบอื่น ๆ ทั้งหมดมีการละเว้นอย่างมีนัยสำคัญ
ตัวis
ดำเนินการไม่ได้ตรวจสอบว่าประเภทรันไทม์ของตัวถูกดำเนินการตรงกับประเภทที่กำหนดหรือไม่ แต่จะตรวจสอบเพื่อดูว่าประเภทรันไทม์เข้ากันได้กับประเภทที่กำหนดหรือไม่:
class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.
แต่การตรวจสอบเอกลักษณ์ประเภทด้วยการสะท้อนตรวจสอบเอกลักษณ์ไม่ใช่เพื่อความเข้ากันได้
bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal
or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an
หากนั่นไม่ใช่สิ่งที่คุณต้องการคุณอาจต้องการ IsAssignableFrom:
bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A
t
ดังนั้นรูปแบบที่ดีขึ้นมาร์กจะกลายเป็นtypeof(Animal)
t.IsInstanceOfType(x)
GetType()
มีอยู่ในทุกประเภทเฟรมเวิร์กเดียวเนื่องจากถูกกำหนดบนobject
ประเภทฐาน ดังนั้นไม่ว่าจะเป็นประเภทใดก็ตามคุณสามารถใช้มันเพื่อส่งคืนพื้นฐานได้Type
ดังนั้นสิ่งที่คุณต้องทำคือ:
u.GetType() == t
คุณต้องดูว่าประเภทของอินสแตนซ์ของคุณเท่ากับประเภทของคลาสหรือไม่ ในการรับประเภทของอินสแตนซ์คุณใช้GetType()
วิธีการ:
u.GetType().Equals(t);
หรือ
u.GetType.Equals(typeof(User));
ควรทำ เห็นได้ชัดว่าคุณสามารถใช้ '==' เพื่อทำการเปรียบเทียบได้หากต้องการ
u.GetType.Equals(typeof(User));
t
ที่มีประเภทอยู่แล้วก็ตาม
เพื่อตรวจสอบว่าวัตถุเข้ากันได้กับตัวแปรชนิดที่กำหนดหรือไม่แทนที่จะเขียน
u is t
คุณควรเขียน
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
สั้นกว่าและตรงไปตรงมากว่าtypeof(Animal).IsAssignableFrom(x.GetType());
(และ Resharper จะแนะนำให้ใช้แบบเดิมถ้าคุณใช้แบบหลัง)