Для объекта, я могу получить все его подклассы, используя отражение или другие способы? - PullRequest
51 голосов
/ 19 января 2012

Могу ли я получить все его подклассы для объекта с помощью отражения?

Ответы [ 2 ]

72 голосов
/ 19 января 2012

Вы можете загрузить все типы в сборку, а затем перечислить их, чтобы увидеть, какие из них реализуют тип вашего объекта. Вы сказали «объект», поэтому приведенный ниже пример кода не предназначен для интерфейсов. Кроме того, этот пример кода ищет только ту же сборку, в которой был объявлен объект.

class A
{}
...
typeof(A).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(A)));

Или, как предлагается в комментариях, используйте этот пример кода для поиска по всем загруженным сборкам.

var subclasses =
from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetTypes()
    where type.IsSubclassOf(typeof(A))
    select type

Для обоих примеров кода требуется добавить using System.Linq;

10 голосов
/ 19 января 2012

Подклассы, означающие интерфейсы? Да:

this.GetType().GetInterfaces()

Подклассы, означающие базовые типы? Ну, C # может иметь только один базовый класс

Подклассы, означающие все классы, которые наследуются от вашего класса? Да:

РЕДАКТИРОВАТЬ: (спасибо vcsjones)

foreach(var asm in AppDomain.CurrentDomain.GetAssemblies())
{
        foreach (var type in asm.GetTypes())
        {
            if (type.BaseType == this.GetType())
                yield return type;
        }
}

И сделать это для всех загруженных сборок

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