วิธีเปรียบเทียบประเภท


130

คำถามด่วน: จะเปรียบเทียบประเภทประเภท (ไม่ได้ตั้งใจ) กับประเภทอื่นใน C # ได้อย่างไร? ฉันหมายความว่าฉันได้Type typeFieldและฉันต้องการที่จะรู้ว่าถ้ามันเป็นSystem.String, System.DateTimeฯลฯ แต่typeField.Equals(System.String)ไม่ทำงาน

เบาะแสใด ๆ ?

คำตอบ:


180

ลองทำดังต่อไปนี้

typeField == typeof(string)
typeField == typeof(DateTime)

ตัวtypeofดำเนินการใน C # จะให้Typeวัตถุสำหรับประเภทที่ตั้งชื่อ Typeอินสแตนซ์สามารถเปรียบเทียบได้กับตัว==ดำเนินการดังนั้นนี่จึงเป็นวิธีที่ดีในการเปรียบเทียบ

หมายเหตุ: ถ้าฉันจำไม่ผิดมีบางกรณีที่จะแบ่งออกเมื่อประเภทที่เกี่ยวข้องคืออินเตอร์เฟส COM ซึ่งฝังอยู่ในแอสเซมบลี (ผ่าน NoPIA) ฟังดูไม่เหมือนในกรณีนี้


76

คุณสามารถใช้สำหรับมันผู้ประกอบการis จากนั้นคุณสามารถตรวจสอบว่าวัตถุเป็นประเภทเฉพาะหรือไม่โดยการเขียน:

if (myObject is string)
{
  DoSomething()
}

3
จะดีกว่าสำหรับเรา "is" หรือ "typeof"?
Brent Wagoner

32

คุณสามารถเปรียบเทียบสำหรับประเภทเดียวกันโดยใช้:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof ส่งคืนวัตถุ Type จากคลาสที่กำหนด

แต่ถ้าคุณมีประเภท B ซึ่งสืบทอดมาจาก A การเปรียบเทียบนี้จะเป็นเท็จ และคุณกำลังมองหาIsAssignableFrom

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

หากอินสแตนซ์ของคุณคือType:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

แต่ถ้าอินสแตนซ์ของคุณเป็นobjectและไม่ได้Typeใช้ตัวasดำเนินการ:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

สิ่งนี้มีข้อดีในการแปลงvalueเพียงครั้งเดียวเป็นประเภทที่ระบุ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.