คำถามด่วน: จะเปรียบเทียบประเภทประเภท (ไม่ได้ตั้งใจ) กับประเภทอื่นใน C # ได้อย่างไร? ฉันหมายความว่าฉันได้Type typeFieldและฉันต้องการที่จะรู้ว่าถ้ามันเป็นSystem.String, System.DateTimeฯลฯ แต่typeField.Equals(System.String)ไม่ทำงาน
เบาะแสใด ๆ ?
คำถามด่วน: จะเปรียบเทียบประเภทประเภท (ไม่ได้ตั้งใจ) กับประเภทอื่นใน C # ได้อย่างไร? ฉันหมายความว่าฉันได้Type typeFieldและฉันต้องการที่จะรู้ว่าถ้ามันเป็นSystem.String, System.DateTimeฯลฯ แต่typeField.Equals(System.String)ไม่ทำงาน
เบาะแสใด ๆ ?
คำตอบ:
ลองทำดังต่อไปนี้
typeField == typeof(string)
typeField == typeof(DateTime)
ตัวtypeofดำเนินการใน C # จะให้Typeวัตถุสำหรับประเภทที่ตั้งชื่อ Typeอินสแตนซ์สามารถเปรียบเทียบได้กับตัว==ดำเนินการดังนั้นนี่จึงเป็นวิธีที่ดีในการเปรียบเทียบ
หมายเหตุ: ถ้าฉันจำไม่ผิดมีบางกรณีที่จะแบ่งออกเมื่อประเภทที่เกี่ยวข้องคืออินเตอร์เฟส COM ซึ่งฝังอยู่ในแอสเซมบลี (ผ่าน NoPIA) ฟังดูไม่เหมือนในกรณีนี้
คุณสามารถเปรียบเทียบสำหรับประเภทเดียวกันโดยใช้:
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
}
หากอินสแตนซ์ของคุณคือ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เพียงครั้งเดียวเป็นประเภทที่ระบุ
http://msdn.microsoft.com/en-us/library/system.type.gettype.aspx
Console.WriteLine("typeField is a {0}", typeField.GetType());
ซึ่งจะให้สิ่งที่ชอบ
typeField is a String
typeField is a DateTime
หรือ
http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx