Re: Перечислить наследников
От: Воронков Василий Россия  
Дата: 23.04.04 07:30
Оценка: 3 (1)
"_Dmitry_" <10601@news.rsdn.ru> wrote in message news:617059@news.rsdn.ru...
> Как перечислить всех наследников?
> Или как перечислить все типы и каждый проверить является он наследником или нет?

Т.е., если я правильно понимаю, задача в следующем. Есть некий тип myType и надо, допустим, найти всех его наследников в пределах сборки? Можно сделать примерно так:

foreach (Type t in myType.Assembly.GetTypes())
    if (t.IsSubclassOf(myType))
        Console.WriteLine(t.Name);
Posted via RSDN NNTP Server 1.8
Перечислить наследников
От: _Dmitry_  
Дата: 23.04.04 06:04
Оценка:
Как перечислить всех наследников?
Или как перечислить все типы и каждый проверить является он наследником или нет?
Re: Перечислить наследников
От: Малич Юрий Германия http://malich.ru
Дата: 23.04.04 07:13
Оценка:
Здравствуйте, _Dmitry_, Вы писали:

_D_>Как перечислить всех наследников?


Type.BaseType
Type.GetInterfaces();
"Практика — критерий истины" (c) Маркс
Re[2]: Перечислить наследников
От: _Dmitry_  
Дата: 23.04.04 07:20
Оценка:
Здравствуйте, Малич Юрий, Вы писали:

МЮ>Здравствуйте, _Dmitry_, Вы писали:


_D_>>Как перечислить всех наследников?


МЮ>Type.BaseType

МЮ>Type.GetInterfaces();

Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.
Re[3]: Перечислить наследников
От: Малич Юрий Германия http://malich.ru
Дата: 23.04.04 07:28
Оценка:
Здравствуйте, _Dmitry_, Вы писали:

_D_>Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.


Ок. Не понял вопрос. Можно конечно перечислить все типы внутри сборки и проверить каждый, но от public-типа можно наследоватся и в другой сборке ... Так что простого универсального решения тут нет и быть не может.
"Практика — критерий истины" (c) Маркс
Re[3]: Перечислить наследников
От: GarryIV  
Дата: 23.04.04 07:31
Оценка:
Здравствуйте, _Dmitry_, Вы писали:

_D_>>>Как перечислить всех наследников?


МЮ>>Type.BaseType

МЮ>>Type.GetInterfaces();

_D_>Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.


Вполне логично что базовый класс понятия не имеет о своих наследниках. Они вообще могут быть и в другой сборке и в африке. А в пределах выбранных сборок вышеуказанных функций вполне достаточно чтоб построить иерархию и таки узнать всех наследников.
... << RSDN@Home 1.1.3 stable >>
WBR, Igor Evgrafov
Re[2]: Перечислить наследников
От: _Dmitry_  
Дата: 23.04.04 08:21
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Т.е., если я правильно понимаю, задача в следующем. Есть некий тип myType и надо, допустим, найти всех его наследников в пределах сборки? Можно сделать примерно так:


ВВ>
ВВ>foreach (Type t in myType.Assembly.GetTypes())
ВВ>    if (t.IsSubclassOf(myType))
ВВ>        Console.WriteLine(t.Name);
ВВ>


Я решил искать в AppDomain'e:

Assembly* assemblies __gc[] = AppDomain::get_CurrentDomain()->GetAssemblies();
for (int i = 0; i<assemblies->get_Count(); i++)
{
    Type* types __gc[] = dynamic_cast<Assembly*>(assemblies->get_Item(i))->GetTypes();
        for (int j = 0; j<types->get_Count(); j++)
        {
            if (dynamic_cast<Type*>(types->get_Item(j))->IsSubclassOf(__typeof(AccessPermission)))
                System::Console::WriteLine(types->get_Item(j));
        }
}


Спасибо!
Re[3]: Перечислить наследников
От: Воронков Василий Россия  
Дата: 23.04.04 08:24
Оценка:
"_Dmitry_" <10601@news.rsdn.ru> wrote in message news:617315@news.rsdn.ru...

Только советую для повышения производительности все свои сборки пометить каким-нибудь атрибутом на ассембле-уровне типа assembly:MyCoolProg и проверять его наличие. А то будет фильтровать типы в "лишних" сборках.
Posted via RSDN NNTP Server 1.8
Re[3]: Перечислить наследников
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.04.04 19:18
Оценка:
Здравствуйте, _Dmitry_, Вы писали:

_D_>Я решил искать в AppDomain'e:


_D_>
_D_>Assembly* assemblies __gc[] = AppDomain::get_CurrentDomain()->GetAssemblies();
_D_>for (int i = 0; i<assemblies->get_Count(); i++)
_D_>{
_D_>    Type* types __gc[] = dynamic_cast<Assembly*>(assemblies->get_Item(i))->GetTypes();
_D_>        for (int j = 0; j<types->get_Count(); j++)
_D_>        {
_D_>            if (dynamic_cast<Type*>(types->get_Item(j))->IsSubclassOf(__typeof(AccessPermission)))
_D_>                System::Console::WriteLine(types->get_Item(j));
_D_>        }
_D_>}
_D_>


1) Так ты сможешь найти только в уже загруженных сборках. Если к сборке еще не разу не обращались то в коллекции ее не будет
2) В mscorlib очень много классов. Так что ты бы хотя бы МСовские сборки повыкидывал, например по публичным ключам МС и ECMA.
... << RSDN@Home 1.1.3 beta 2 (Win32NT 5.1.2600.0) >>
AVK Blog
Re[4]: Перечислить наследников
От: mihailik Украина  
Дата: 27.04.04 13:43
Оценка:
AVK>1) Так ты сможешь найти только в уже загруженных
AVK>2) В mscorlib очень много классов

3) В процессе поиска могут загрузиться ещё какие-то сборки. GetAssemblies возвращает массив-"снапшот" на текущий момент вызова, поэтому этих новых сборок ты не увидишь.


Когда такое может произойти? Например, когда класс наследуется от какой-то дополнительной сборки, которая ещё не загружена.
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.