Akankah GetType () mengembalikan tipe yang paling banyak diturunkan saat dipanggil dari kelas dasar?


118

Akankah GetType () mengembalikan tipe yang paling banyak diturunkan saat dipanggil dari kelas dasar?

Contoh:

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
}

Atau haruskah saya membuat metode abstrak yang harus diterapkan oleh kelas turunan seperti berikut?

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
baik - apakah Anda mencobanya?
BrokenGlass

2
@BrokenGlass biasanya saya hanya akan melakukan itu tetapi saya tidak di depan komputer ... hanya menggunakan ponsel saya untuk membuat posting karena solusi untuk masalah mulai terbentuk dan saya ingin tahu sekarang! = P
Feisty Mango

Jawaban:


133

GetType()akan mengembalikan tipe aktual yang dipakai. Dalam kasus Anda, jika Anda memanggil GetType()sebuah instance B, itu akan kembali typeof(B), bahkan jika variabel yang dimaksud dideklarasikan sebagai referensi ke A.

Tidak ada alasan untuk GetSubType()metode Anda .


Apakah itu? Saya melewati instance objek dari kelas super (abstrak), penerima hanya melihat kelas super. Bukankah itu akan selalu mengembalikan apa yang pegangan didefinisikan sebagai bukan contoh? - atau apakah saya melewatkan sesuatu?

Ah ha .. perbedaannya adalah menggunakan TypeOf (X) vs x.GetType () saya pikir

22

GetTypeselalu mengembalikan jenis yang sebenarnya dipakai. yaitu tipe yang paling banyak diturunkan. Ini berarti Anda GetSubTypeberperilaku seperti GetTypedirinya sendiri dan karenanya tidak perlu.

Untuk secara statis mendapatkan informasi tipe dari beberapa tipe yang dapat Anda gunakan typeof(MyClass).

Kode Anda memiliki kesalahan: tidak System.Attribute.GetCustomAttributesmengembalikan .Attribute[]Type


7

GetType selalu mengembalikan tipe sebenarnya.

Alasannya ada jauh di dalam framework .NET dan CLR , karena JIT dan CLR menggunakan .GetTypemetode untuk membuat objek Type di memori yang menyimpan informasi tentang objek tersebut, dan semua akses ke objek dan kompilasi dilakukan melalui instance Type ini .

Untuk informasi lebih lanjut, lihat buku "CLR via C #" dari Microsoft Press.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.