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();
   }
}
Mangga yang Kuat
sumber
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 .

Reed Copsey
sumber
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

CodesInChaos
sumber
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.

yoel halb
sumber