Использование LINQ для поиска класса, который находится внизу цепочки наследования - PullRequest
0 голосов
/ 16 сентября 2010

Учитывая последовательность сборок с классами, например.

  AssemblyA
    Customer
  AssemblyB
    Customer : AssemblyA.Customer
  AssemblyC
    Customer : AssemblyB.Customer

Учитывая имя (не заботящееся о пространстве имен) Customer, могу ли я использовать LINQ для запроса по последовательности сборок, чтобы найти клиента внижняя часть цепочки наследования (в данном случае AssemblyC.Customer)?

Ответы [ 3 ]

1 голос
/ 17 сентября 2010
IEnumerable<Assembly> assemblies = ...
Assembly assemblyA = ...

// Since you say the only fact you wish to use about the class is that it
// is named 'Customer' and it exists in Assembly A, this is just about the 
// only way to construct the Type object. Pretty awful though...
Type customerType = assemblyA.GetTypes() 
                             .Single(t => t.Name == "Customer");    

// From all the types in the chosen assemblies, find the ones that subclass 
// Customer, picking the one with the deepest inheritance heirarchy.
Type bottomCustomerType = assemblies.SelectMany(a => a.GetTypes())
                                    .Where(t => t.IsSubclassOf(customerType))
                                    .OrderByDescending(t => t.GetInheritanceDepth())
                                    .First();
 ...

public static int GetInheritanceDepth(this Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");

    int depth = 0;

    // Keep walking up the inheritance tree until there are no more base classes.
    while (type != null)
    {
        type = type.BaseType;
        depth++;
    }

    return depth;
}
0 голосов
/ 17 сентября 2010

Первый вопрос - как определить сборки для поиска.System.Reflection.Assembly предоставляет ряд методов для перечисления определенных типов сборок - например, GetReferencedAssemblies () найдет сборки, на которые ссылается данная сборка, - полезно, если у вас есть сборка C (которая ссылается на B и A), но не если вы простоиметь сборку А (на которую нет ссылок).Вы также можете сканировать диск или другие методы, в зависимости от ваших потребностей.

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

Применяйте эту логику рекурсивно, пока не дойдете до конца дерева.Комментатор по вашему вопросу прав: у дерева может быть несколько ветвей.

Я не знаю, почему вы хотите использовать Linq для этого - Linq, похоже, не создан для этого типа вопросов.Лично я не нашел способа выполнять операции с рекурсией или на основе очереди внутри Linq.Я бы просто использовал для этого простые выражения C # или VB, а не Linq.

0 голосов
/ 16 сентября 2010

Этот инструмент может вам помочь:

http://www.red -gate.com / products / отражатель /

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