Может obj.GetType(). IsInterface верно?
Выполняя что-то почти совершенно неактуальное, в голову вошел вопрос:
Может ли выражение формы obj.GetType().IsInterface
быть истинным в базе кода, состоящей исключительно из кода С#?
Я подозреваю, что ответ отрицательный, потому что:
-
GetType()
всегда будет возвращать тип времени выполнения.
- Тип выполнения для конкретных типов соответствует вызываемому конструктору. Таким образом, он никогда не является интерфейсом, потому что интерфейсы не имеют конструкторов.
- Анонимные типы не могут реализовать интерфейс (и если бы они это сделали, у них все равно был бы свой тип анонимного класса).
- Экземпляры внутренних классов других сборок, реализующих общедоступные интерфейсы, по-прежнему будут иметь класс как тип времени выполнения.
- Используя
[ComImport, CoClass(typeof(MyClass))]
на интерфейсе, похоже, что вы можете его создать, но вызов конструктора фактически создает экземпляр ссылочного класса.
Я не могу думать ни о каком другом случае. Я что-то упустил, или я правильно понял?
Ответы
Ответ 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
когда-либо типом интерфейса", - в этом случае я подозреваю, что ответ отрицательный.