Использование отражения .net для поиска общего класса предков - PullRequest
3 голосов
/ 09 февраля 2012

У меня есть сборка, содержащая типы, имеющие общий класс предков (определенный в сборке. В большинстве случаев общим предком является , а не непосредственный базовый тип класса.

Мне нужнобыть в состоянии отфильтровать из всех типов в этой сборке те, которые имеют этого общего предка. По разным причинам я не могу создать экземпляр типов (у них, как правило, нет общей сигнатуры конструктора), поэтому я должен начать с myAssembly.GetTypes() и изучите свойства самих типов. Другими словами, я должен работать с классами, а не с экземплярами классов.

Как мне проверить каждый тип в этой коллекции, чтобы определить, наследуется ли он от желаемогообщий предок или нет?

Позже: не беспокойтесь, у меня это сейчас. Хитрость заключается в том, чтобы создать экземпляр объекта типа, являющегося типом предка из сборки , например

Type ancestor = assy.getType("myAncestorClassName", true, true);
Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(ancestor));

Однако это не будет работать:

Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(typeof(AncestorClass)));

, потому что, я думаю, тип предка определен в другой сборке, а не в основной.ssembly.

Много, намного позже .... Спасибо всем, кто предоставил ответы на этот вопрос.По пути меня отвлекли на что-то другое, но теперь у меня есть изящное решение (и я узнал что-то новое).

Ответы [ 4 ]

4 голосов
/ 09 февраля 2012

Для каждого типа в вашей коллекции вы можете увидеть, происходят ли они от этого предка, используя Type.IsAssignableFrom .

Например:

var types = assembly.GetTypes().Exclude(t => typeof(CommonAncestor).IsAssignableFrom(t));

Thisдолжен получить все типы в сборке, которые не являются производными от CommonAncestor.

2 голосов
/ 09 февраля 2012

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

1 голос
/ 09 февраля 2012

Проверьте этот фрагмент:

var commonAncestor = typeof(object);
var descendants =
    Assembly.GetExecutingAssembly().GetTypes().Where(
    type => commonAncestor.IsAssignableFrom(type));

Это приведет к получению всех типов в текущей сборке, которые произошли от object.Естественно, замените его собственным типом общего предка.

Метод Type.IsAssignableFrom() проверяет, можете ли вы сделать что-то вроде:

MyType b = new MyType();
object a = b;

без ошибок.

1 голос
/ 09 февраля 2012

Если вы используете C #

Type[] types = myAssenbly.GetTypes();

foreach(Type t in types)
{
    // Is a Common Ancestor subclass
    bool isString = t.IsAssignableFrom(typeof(CommonAncestor));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...