Подтвердить что ты не робот

Может obj.GetType(). IsInterface верно?

Выполняя что-то почти совершенно неактуальное, в голову вошел вопрос:

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

Я подозреваю, что ответ отрицательный, потому что:

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

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

4b9b3361

Ответ 1

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

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

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