Чи поверне 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 в пам'яті, який зберігає інформацію про об'єкт, а весь доступ до об'єкта і компіляції здійснюється через цей екземпляр типу .

Для отримання додаткової інформації подивіться книгу "CLR через C #" від Microsoft Press.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.