Может ли obj.GetType().IsInterface быть истинным?

Делая что-то, почти не относящееся к делу, у меня возник вопрос:

Может выражение формы obj.GetType().IsInterface когда-нибудь быть правдой в кодовой базе, состоящей исключительно из кода C#?

Я подозреваю, что ответ - нет, потому что:

  • GetType() всегда будет возвращать тип времени выполнения.
  • Тип времени выполнения для конкретных типов соответствует вызванному конструктору. Таким образом, это никогда не интерфейс, потому что интерфейсы не имеют конструкторов.
  • Анонимные типы не могут реализовать интерфейс (и если бы они это сделали, они все равно имели бы свой анонимный тип класса).
  • Экземпляры внутренних классов других сборок, реализующих открытые интерфейсы, по-прежнему будут иметь этот класс в качестве типа времени выполнения.
  • С помощью [ComImport, CoClass(typeof(MyClass))] в интерфейсе это выглядит так, как будто вы можете создать его экземпляр, но вызов конструктора фактически создает экземпляр ссылочного класса.

Я не могу думать ни о каком другом случае. Я что-то упустил или моя догадка верна?

1 ответ

Решение

Может выражение формы obj.GetType().IsInterface когда-нибудь быть правдой в кодовой базе, состоящей исключительно из кода C#?

Да, но, вероятно, не так, как вы думали:

using System;

public class EvilClass
{
    public new Type GetType()
    {
        return typeof(IDisposable);
    }
}

class Test
{
    static void Main()
    {
        EvilClass obj = new EvilClass();
        Console.WriteLine(obj.GetType().IsInterface); // True
    }
}

Немного похоже, я думаю, вы могли бы создать подкласс RealProxy который будет перехватывать вызов и возвращать тип интерфейса.

Если вы имеете в виду "будет возвращаемое значение GetType() метод объявлен в object когда-либо быть интерфейсом типа " - в этом случае я подозреваю, что ответ - нет.

Другие вопросы по тегам