GetType () จะส่งคืนชนิดที่ได้รับมากที่สุดเมื่อเรียกจากคลาสฐานหรือไม่?


118

GetType () จะส่งคืนชนิดที่ได้รับมากที่สุดเมื่อเรียกจากคลาสฐานหรือไม่?

ตัวอย่าง:

public abstract class A
{
    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(this.GetType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them
}

หรือฉันควรสร้างวิธีนามธรรมที่คลาสที่ได้รับจะต้องนำไปใช้ดังต่อไปนี้?

public abstract class A
{
    protected abstract Type GetSubType();

    private Type GetInfo()
    {
         return System.Attribute.GetCustomAttributes(GetSubType());
    }
}

public class B : A
{
   //Fields here have some custom attributes added to them

   protected Type GetSubType()
   {
       return GetType();
   }
}

10
ดี - คุณลองหรือยัง?
BrokenGlass

2
@BrokenGlass ปกติฉันจะทำอย่างนั้น แต่ฉันไม่ได้อยู่ที่คอมพิวเตอร์ ... แค่ใช้โทรศัพท์ของฉันในการโพสต์เพราะวิธีแก้ปัญหากำลังเริ่มก่อตัวขึ้นและฉันก็อยากรู้ตอนนี้! = P
Feisty Mango

คำตอบ:


133

GetType()จะส่งคืนประเภทที่สร้างอินสแตนซ์จริง ในกรณีของคุณหากคุณเรียกGetType()ใช้อินสแตนซ์Bมันจะส่งคืนtypeof(B)แม้ว่าตัวแปรที่เป็นปัญหาจะถูกประกาศว่าเป็นการอ้างอิงถึงAไฟล์.

ไม่มีเหตุผลสำหรับGetSubType()วิธีการของคุณ


มันเป็นอย่างไร? ฉันกำลังส่งตัวอย่างของวัตถุจากซุปเปอร์คลาส (นามธรรม) ของมันผู้รับจะเห็นเฉพาะซูเปอร์คลาสเท่านั้น ไม่ใช่ว่ามันจะส่งคืนสิ่งที่แฮนเดิลถูกกำหนดว่าไม่ใช่อินสแตนซ์เสมอไป? - หรือฉันพลาดอะไรไป?

อาฮ่า .. ความแตกต่างคือการใช้ TypeOf (X) กับ x.GetType () ฉันคิดว่า

22

GetTypeส่งคืนประเภทที่สร้างอินสแตนซ์จริงเสมอ คือประเภทที่ได้รับมากที่สุด ซึ่งหมายความว่าGetSubTypeพฤติกรรมของคุณเหมือนกับGetTypeตัวเองดังนั้นจึงไม่จำเป็น

หากต้องการรับข้อมูลประเภทบางประเภทแบบคงที่คุณสามารถtypeof(MyClass)ใช้ได้

รหัสของคุณมีความผิดพลาดแม้ว่า: System.Attribute.GetCustomAttributesผลตอบแทนไม่ได้Attribute[]Type


7

GetType ส่งกลับประเภทจริงเสมอ

สาเหตุของมันอยู่ลึกในกรอบ. NETและCLRเนื่องจาก JIT และ CLR ใช้.GetTypeวิธีการสร้างวัตถุ Type ในหน่วยความจำที่เก็บข้อมูลบนวัตถุและการเข้าถึงวัตถุและการคอมไพล์ทั้งหมดจะผ่านอินสแตนซ์ Type นี้ .

สำหรับข้อมูลเพิ่มเติมโปรดอ่านหนังสือ "CLR via C #" จาก Microsoft Press

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