Visual Studio: как показать все классы, унаследованные от базового класса? - PullRequest
122 голосов
/ 12 ноября 2008

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

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

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

Пожалуйста, докажите, что я не прав.

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

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

Ответы [ 18 ]

128 голосов
/ 29 июня 2013

для VS2012,

  1. Перейдите к файлу в обозревателе решений
  2. Разверните и выберите свой класс
  3. Щелкните правой кнопкой мыши элемент класса (не элемент файла) -> Производные типы
70 голосов
/ 25 января 2011

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

Возможно, он не такой прямой, как Resharper, но это вариант, если у вас еще нет R #.

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

48 голосов
/ 12 ноября 2008

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

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

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


В Resharper 9.2 для любого типа в исходном коде щелкните правой кнопкой мыши «Find Usage Advanced», выберите Find = «Derived» и Scope = «Solutions and Libraries».
Например, чтобы найти все наследники (как в библиотеке, так и в вашем коде) некоторого базового класса во включенной DLL любого поставщика, объявите переменную в своем коде с этим базовым классом. Затем щелкните правой кнопкой мыши имя базового класса, которое вы только что ввели.

13 голосов
/ 26 июня 2012

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

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

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

//Go through all the types and either add them to a tree node, or add a tree
//node or more to them depending whether the type is a base or derived class.
//If neither base or derived, 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();
9 голосов
/ 07 августа 2012

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

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

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

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

  1. Запуск dotPeek
  2. Выберите «Открыть из GAC ...» и добавьте сборку System.Web.MVC
  3. Выберите «Навигация / Перейти к типу» и введите ActionResult
  4. В объявлении класса ActionResult щелкните правой кнопкой мыши и выберите «Производные символы»
  5. Вуаля! Отображается каждый производный класс (даже несколько, о которых я не знал!)
9 голосов
/ 16 июня 2017

Начиная с «Visual Studio 2015 Update 1», вы можете просто щелкнуть правой кнопкой мыши на имени класса в редакторе кода класса и затем выбрать «Перейти к реализации» из контекстного меню: сочетание клавиш Ctrl + F12 является ярлыком.

Подробнее см. https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/.

7 голосов
/ 19 октября 2012

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

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

5 голосов
/ 29 апреля 2017

Try Visual Studio Class View

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

5 голосов
/ 03 ноября 2009

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

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

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

4 голосов
/ 09 августа 2016

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

see derived classes reSharper

...