GetType (), temel sınıftan çağrıldığında en türetilmiş türü döndürür mü?


118

GetType (), temel sınıftan çağrıldığında en türetilmiş türü döndürür mü?

Misal:

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
}

Veya türetilmiş sınıfların aşağıdaki gibi uygulaması gereken soyut bir yöntem mi yapmalıyım?

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
iyi - denedin mi?
BrokenGlass

2
@BrokenGlass normalde bunu yapardım ama bilgisayar başında değilim ... sadece postayı yapmak için telefonumu kullandım çünkü bir problem için bir çözüm oluşmaya başlıyordu ve şimdi merak ediyordum! = P
Feisty Mango

Yanıtlar:


133

GetType()gerçek, örneklenmiş türü döndürür. Senin durumda, eğer arama GetType()örneğinde B, bu dönecektir typeof(B)söz konusu değişken bir için bir referans olarak ilan olsa bile, A.

GetSubType()Yönteminiz için hiçbir sebep yok .


Öyle mi? (Soyut) süper sınıfından bir nesnenin örneğini iletiyorum, alıcı yalnızca süper sınıfı görüyor. Her zaman tutamacın örnek olarak tanımlanmadığı şeyi döndürecek değil mi? - yoksa bir şey mi kaçırıyorum?

Ah ha .. aradaki fark TypeOf (X) ile x.GetType () arasında bence

22

GetTypeher zaman gerçekte somutlaştırılmış türü döndürür. yani en çok türetilmiş tür. Bu, GetSubTypetıpkı sizin gibi davrandığınız GetTypeve dolayısıyla gereksiz olduğu anlamına gelir .

Statik olarak kullanabileceğiniz bazı türlerin tür bilgilerini almak için typeof(MyClass).

Yine de kodunuzda bir hata var: System.Attribute.GetCustomAttributesgeri Attribute[]dönmüyor Type.


7

GetType her zaman gerçek türü döndürür.

JIT ve CLR , nesneye ilişkin bilgileri tutan bellekte bir Type nesnesi oluşturmak için yöntemi kullandığından ve nesneye ve derlemeye tüm erişim bu Type örneğiyle olduğundan, bunun nedeni .NET çerçevesi ve CLR'de derindir. .GetType.

Daha fazla bilgi için, Microsoft Press'in "C # aracılığıyla CLR" kitabına bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.