"_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);
Здравствуйте, Малич Юрий, Вы писали:
МЮ>Здравствуйте, _Dmitry_, Вы писали:
_D_>>Как перечислить всех наследников?
МЮ>Type.BaseType МЮ>Type.GetInterfaces();
Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.
Здравствуйте, _Dmitry_, Вы писали:
_D_>Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.
Ок. Не понял вопрос. Можно конечно перечислить все типы внутри сборки и проверить каждый, но от public-типа можно наследоватся и в другой сборке ... Так что простого универсального решения тут нет и быть не может.
Здравствуйте, _Dmitry_, Вы писали:
_D_>>>Как перечислить всех наследников?
МЮ>>Type.BaseType МЮ>>Type.GetInterfaces();
_D_>Вопрос о том можно ли в базовом классе узнать наследников, а не о том чтобы в наследнике узнать базовый класс.
Вполне логично что базовый класс понятия не имеет о своих наследниках. Они вообще могут быть и в другой сборке и в африке. А в пределах выбранных сборок вышеуказанных функций вполне достаточно чтоб построить иерархию и таки узнать всех наследников.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Т.е., если я правильно понимаю, задача в следующем. Есть некий тип 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));
}
}
Только советую для повышения производительности все свои сборки пометить каким-нибудь атрибутом на ассембле-уровне типа assembly:MyCoolProg и проверять его наличие. А то будет фильтровать типы в "лишних" сборках.
1) Так ты сможешь найти только в уже загруженных сборках. Если к сборке еще не разу не обращались то в коллекции ее не будет
2) В mscorlib очень много классов. Так что ты бы хотя бы МСовские сборки повыкидывал, например по публичным ключам МС и ECMA.
AVK>1) Так ты сможешь найти только в уже загруженных AVK>2) В mscorlib очень много классов
3) В процессе поиска могут загрузиться ещё какие-то сборки. GetAssemblies возвращает массив-"снапшот" на текущий момент вызова, поэтому этих новых сборок ты не увидишь.
Когда такое может произойти? Например, когда класс наследуется от какой-то дополнительной сборки, которая ещё не загружена.