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