Получить унаследованный тип объекта во время выполнения - PullRequest
1 голос
/ 22 июня 2011

Если считать:

class A : IInterface { }

во время выполнения:

A instance = new A();

instance.GetType(); // returns "A"

или

IInterface instance = new A();

instance.GetType(); // returns "A"

или

object instance = new A();
instance.GetType(); // returns "A"

Вопрос: Как получить IInterface как Тип?

Ответы [ 5 ]

8 голосов
/ 22 июня 2011

instance.GetType().GetInterfaces() получит все интерфейсы, реализованные или унаследованные типом экземпляра (метод Type.GetInterfaces) .

2 голосов
/ 22 июня 2011

Проверка Type.GetInterface метод:

Вместо попытки приведения к какому-либо объекту интерфейса необходимо проверить, реализует ли объекттакой интерфейс.Если это так, вы можете привести его к типу интерфейса или, если вы хотите напечатать тип в некоторый поток, если он реализует интерфейс, вывести его строковое представление.

Вы можете реализовать расширениеметод, подобный следующему, чтобы облегчить жизнь:

public static bool Implements<T>(this Type some)
{
    return typeof(T).IsInterface && some.GetInterfaces().Count(someInterface => someInterface == typeof(T)) == 1;

}

И, наконец, вы можете сделать это:

Type interfaceType = someObject.GetType().Implements<IInterface>() ? typeof(IInterface) : default(Type);
2 голосов
/ 22 июня 2011

GetType () всегда будет указывать вам тип класса, к которому у вас есть экземпляр, независимо от того, какая у вас ссылка на него. Вы заметили это в своем вопросе.

Если вы всегда хотите получить объект типа для IInterface, вы также можете использовать

typeof(IInterface)

Если вам нужен список интерфейсов, которые реализует тип, вы можете использовать

instance.GetType().GetInterfaces()
1 голос
/ 22 июня 2011

Если вам нужно проверить конкретный интерфейс, вы можете использовать ключевое слово «is», если (instance is IInterface) // сделать что-то

1 голос
/ 22 июня 2011

См. Довольно хорошую статью Скотта Хансельмана на эту тему:

http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx

   Type type = instance.GetType()
   Type[] ifaces = type.GetInterfaces()

Должен решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...