Visual Studio: как показать все классы, унаследованные от базового класса?

В Visual Studio, как показать все классы, унаследованные от базового класса?

Например,, в ASP.NET MVC существует несколько типов ActionResult - и они все наследуют/реализуют базовый класс ActionResult.

Похоже, что если вы просто не знаете, что View и Json являются допустимыми типами ActionResult, вы не можете легко найти эту информацию.

Прошу доказать, что я ошибаюсь.

Есть ли что-то в обозревателе объектов, что облегчает его поиск?

Я даже предлагаю инструменты вне Visual Studio, чтобы узнать эту информацию о различных классах. Например: есть ли что-то в Resharper, которое поможет мне?

Ответ 1

Конечно, Resharper может это сделать. И многое другое.

Просто щелкните правой кнопкой мыши имя типа в любом месте и выберите "Go To Inheritor" в контекстном меню. "Go To Inheritor" также может применяться к методу навигации к переопределениям и реализациям интерфейса. Для интерфейса вы можете снова вызвать "Find Usages Advanced", просто щелкните правой кнопкой мыши), где можно найти все расширения и реализации. Для типов типа. И моя любимая функция - нажмите кнопку Hold для любого типа/метода для перехода к его объявлению.

Я думаю, что это обязательный инструмент для разработчиков .net.


В Resharper 9.2 на любом типе исходного кода rt-click "Find Usage Advanced" выберите Find = "Производные" и Scope = "Решения и библиотеки".
Например, чтобы найти все наследники (как в библиотеке, так и в вашем коде) какого-либо базового класса в включенной DLL от любого поставщика, объявите переменную в вашем коде с этим базовым классом. Затем щелкните правой кнопкой мыши имя этого базового класса, которое вы только что набрали.

Ответ 2

Для VS2012,

  • Перейдите к файлу в проводнике решений
  • Разверните и выберите класс
  • Щелкните правой кнопкой мыши элемент класса (не файл) → Производные типы

Ответ 3

Для этого вам необязательно Reflector - Visual Studio "Диаграмма классов" позволит вам легко найти все производные классы для определенного класса. Щелкните правой кнопкой мыши на классе в "Class View" и выберите "View Class Diagram". Если диаграмма не показывает уровень детализации, который вы хотите для иерархии, щелкните правой кнопкой мыши на поле для класса на диаграмме и выберите "Показать производные классы".

Может быть, не так прямо, как Resharper, но это вариант, если у вас уже нет R #.

К сожалению, я не уверен, какие именно версии Visual Studio имеют его.

Ответ 4

Это наименее ленивый ответ (я просто горжусь этим ответом:)

У меня нет ReSharper, попробовал это раньше, но не хотел его покупать. Я пробовал диаграмму классов, но не практичен вообще, потому что диаграмма иерархии охватывает мир 3 раза, а экран моего ноутбука не имеет бесконечной ширины. Таким образом, мое естественное и простое решение заключалось в том, чтобы написать код Windows Forms для повторения типов в сборке и использовать отражение для добавления узлов в древовидное представление следующим образом:

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

//go through all the types and add them to a tree node or add a tree node or more to them as they might be parents or children of a class. if neither just add them to the dictionary so that they be checked in the next iterations for being a parent a child or just remain a root level node.

var types = typeof(TYPEOFASSEMBLY).Assembly.GetExportedTypes().ToList();
Dictionary<Type, TreeNode> typeTreeDictionary = new Dictionary<Type, TreeNode>();
foreach (var t in types)
{
    var tTreeNode = FromType(t);
    typeTreeDictionary.Add(t, tTreeNode);

    //either a parent or a child, never in between
    bool foundPlaceAsParent = false;
    bool foundPlaceAsChild = false;
    foreach (var d in typeTreeDictionary.Keys)
    {
        if (d.BaseType.Equals(t))
        {
            //t is parent to d
            foundPlaceAsParent = true;
            tTreeNode.Nodes.Add(typeTreeDictionary[d]);
            //typeTreeDictionary.Remove(d);
        }
        else if (t.BaseType.Equals(d))
        {
            //t is child to d
            foundPlaceAsChild = true;
            typeTreeDictionary[d].Nodes.Add(tTreeNode);
        }
    }

    if (!foundPlaceAsParent && !foundPlaceAsChild)
    {
        //classHierarchyTreeView.Nodes.Add(tn);
    }
}

foreach (var t in typeTreeDictionary.Keys)
{
    if (typeTreeDictionary[t].Level == 0)
    {
        classHierarchyTreeView.Nodes.Add(typeTreeDictionary[t]);
    }
}

StringBuilder sb = new StringBuilder();
foreach (TreeNode t in classHierarchyTreeView.Nodes)
{
    sb.Append(GetStringRepresentation(t, 0));
}
textBox2.Text = sb.ToString();

код >

Ответ 5

Никто еще не упомянул об этом, поэтому я добавлю его.
Jetbrains dotPeek - бесплатный декомпилятор .NET, способный легко отображать эту информацию.

Бесплатно скачать: http://www.jetbrains.com/decompiler/

Jetbrains - это компания, которая производит Resharper.

Шаги для поиска производных классов:

  • Запустить dotPeek
  • Выберите "Открыть с GAC..." и добавьте сборку System.Web.MVC
  • Выберите "Навигация/Переход к типу" и введите ActionResult
  • В объявлении класса ActionResult щелкните правой кнопкой мыши и выберите "Производные символы"
  • Voila! Отображается каждый производный класс (даже некоторые, о которых я не знал!)

Ответ 6

Предполагая, что вы установили Resharper: с курсором на класс/интерфейс, щелкните правой кнопкой мыши - Inspect - Hierarchies

Здесь показаны подклассы, реализации и суперклассы.

Ответ 7

Для классов Framework я использую библиотеку MSDN. Секция иерархии наследования идет в обоих направлениях. Правда, это не очень помогает для некоторых 3d-партийных библиотек.

Ответ 8

Вы также можете использовать Reflector.

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

Вы также можете сделать это в Обозревателе объектов, но по какой-то причине VS2008 может сделать это только в одном из представлений .Net Framework. (VS2010 Beta 2 может сделать это в любом представлении)

Ответ 10

С помощью ReSharper (версия 2016.1.2) просто Ctrl + Alt + Click на Базовый класс. Вы увидите что-то вроде этого:

посмотреть производные классы reSharper

Ответ 12

выберите тип и щелкните правой кнопкой мыши, выберите что-нибудь --- покажите на кодовой карте --option выберите его, чтобы сформировать форму форму для тех, кто наследует этот тип как очень приятное изображение. Формат файла .dgml дает гораздо больше информации о типе

Ответ 13

Попробовать Visual Class Class View

В Visual Studio Class View перейдите к интересующему вас классу и найдите его базовые и производные классы

Ответ 14

Просто введите код.

Assembly asm = Assembly.LoadFrom(PATH_TO_PROJECT_OUTPUT);

var types = from t in asm.GetTypes()
            where t.BaseType != null && t.BaseType.ToString() == "System.Web.UI.Page"
            // if you want to add reference - where typeof (System.Web.UI.Page).Equals(t.BaseType) 
            select t;

foreach (var type in types)
{
    Console.WriteLine(type);
}

Ответ 15

если вы перешли на VS2012, вы можете использовать "Кодовую карту".
Щелкните правой кнопкой мыши тип, который вы хотите просмотреть иерархию наследования, и выберите "Добавить в кодовую карту". Затем в представлении кодовой карты вы можете развернуть узлы и щелкнуть правой кнопкой мыши, чтобы выбрать "Show Derived/Base classes". К сожалению, он не работает для классов .NET.

Ответ 16

Для Visual Studio 2012 (Без ReSharper)

  • В обозревателе решений щелкните правой кнопкой мыши класс (производные классы которого вы хотите увидеть).
  • На диаграмме классов щелкните правой кнопкой мыши на классе и выберите "Показать производные классы".

Ответ 17

Очень простой способ сделать это - искать : Classname в окне "Найти и заменить" (CTRL + F) и использовать опцию "Найти параметры/совпадение всего слова". Вы найдете только унаследованные классы.