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


145

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

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

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

Пожалуйста, докажите, что я ошибаюсь.

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

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


2
В Visual C # 2010 Express я ищу решение для ": ActionResult". Не идеально, но лучше, чем ничего.
yoyo

2
Я думаю, вы неправильно поняли мой вопрос. JsonResult (ссылка здесь: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) наследуется от ActionResult. Есть несколько других классов, наследуемых от ActionResult. Как проще всего увидеть все классы, наследуемые от ActionResult?
Дэн Эспарза

3
В этом случае код, который я использую, не является кодом, который появляется непосредственно в моем решении. Это классы инфраструктуры MVC в другой сборке. Поиск ": ActionResult" не будет работать ни для одного кода, который я использую из сборки.
Дэн Эспарза

Ответы:


48

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

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

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


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


7
Какой позор. Разработчики Java, использующие бесплатный Eclipse, имеют эту функциональность прямо из коробки. В моем Resharper + VS2015 я вижу «перейти к реализации», а не «перейти к наследнику».
Северный полюс,

1
Но это не дает мне классов в середине, только уходит. CTRL + ALT + B даст ответ.
Северный полюс,

2
Visual Studio 6 использовала это в проектах C ++ почти 20 лет назад. Обозреватель объектов и диаграмма классов не обеспечивают такой же легкой возможности переворачивать деревья наследования. Недавно я обнаружил, что у Eclipse есть отличная версия этого, по крайней мере, с Java. Пойдемте, MS, позвоните одному из ваших бывших разработчиков и спросите, что у вас было, но потеряно ... Конечно, это требовало, чтобы все проекты генерировали данные просмотра BSC после опции компиляции, но это было нормально. Это действительно было так.
Филип Бек,

153

Для VS2012,

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

9
Это предполагает исходный код, который вы написали. Как это будет работать с примером, указанным в исходном вопросе? (Типы ActionResult)
Дэн Эспарза

Если у вас есть какой-либо тип, производный от ActionResult, вы можете щелкнуть правой кнопкой мыши свой тип и выбрать Base Types, что приведет вас к ActionResult, который теперь вы можете щелкнуть правой кнопкой мыши и выбрать Derived Types. (Если у вас нет типа, производного от ActionResult, вы можете вернуться к System.Object, а затем к ActionResult.)
yoyo

22
Для тех из вас, кто, как и я, щелкнул правой кнопкой мыши файл кода класса и был озадачен тем, почему не было пункта меню «производные типы»: вспомните, что сначала нужно развернуть элемент файла кода, чтобы отобразить элемент класса, а затем щелкните правой кнопкой мыши.
BCA,

3
Я использую VS 2017. К сожалению, здесь показаны только классы, существующие в одной сборке, а не все решение.
NightOwl888,

4
Странно, как эта функция существует в обозревателе решений, но не в представлении классов.
Дай

74

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

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

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


16
Это позволит вам просматривать только те классы в вашем решении, которые наследуют / реализуют целевой класс / интерфейс. Но это полезно знать.
Маркус Жардерот

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

1
Я получил сообщение об ошибке: «В текущем проекте нет типов, производных от XXX», поэтому я думаю, что это ограничено типами в текущем проекте, а не решением
Энди

Могу ли я выполнять «Показать производные классы» рекурсивно? Или мне нужно явно выбирать «Показать производные классы» для каждого подкласса?
Джеймс Вежба

15

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

ReSharper у меня нет, раньше пробовал, но покупать не хотелось. Я пробовал использовать диаграмму классов, но это совсем не практично, потому что диаграмма иерархии охватывает мир в 3 раза, а экран моего ноутбука не имеет бесконечной ширины. Поэтому моим естественным и простым решением было написать код 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();

2
+1 за классный пример кода. А как насчет базовых классов и производных классов в других сборках?
ToolmakerSteve

@ToolmakerSteve, как насчет AppDomain.CurrentDomain.GetAssemblies()? Взгляните на это: stackoverflow.com/questions/851248/…
Mzn

14

Начиная с «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/ для получения дополнительных сведений.


1
Я ценю совет, но я не уверен, что он относится к моему первоначальному варианту использования, когда я вижу все унаследованные классы от базового класса.
Дэн Эспарза

3
@DanEsparza: есть, по крайней мере, в VS2017. Итак, я проголосовал за ответ
Жуан Антунес

1
Мило. К сожалению, не показывает дерево иерархии ... Я просто перечисляю все на одном уровне дерева.
Ломбас

И, как всегда, имя вымышленное, я полностью упустил его из виду во время моего поиска / использования, мне пришлось зайти в StackOverflow, чтобы найти его!
dim8

10

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

Бесплатная загрузка: http://www.jetbrains.com/decompiler/

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

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

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

7

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

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


Хммм ... интересно, но не то, что я искал. Если я щелкну правой кнопкой мыши по возвращенному элементу ActionResult и выполню следующие действия, я получу параметры «Проверить» для «Контроллер» (тип содержащего класса). Если я попытаюсь перейти к определению ViewResult, я окажусь в метаданных, и у меня не будет возможности проверить иерархии.
Дэн Эспарса

1
Также: я вполне уверен, что это функция, предоставляемая Resharper, она не изначально присутствует в Visual Studio ...
Дэн Эспарза

7

Попробуйте Visual Studio Class View

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


3
На самом деле это потенциально полезная точка зрения. К сожалению, он невероятно медленный, не связывает / не отслеживает текущий редактор и, как правило, кажется второстепенным в VS.
E-Riz

Это показывает все классы, а не только те, которые есть в вашем решении, и работает прямо из коробки. Это не медленно. Для более графического представления используйте также встроенную функцию Class Diagram (но она отображает только классы в вашем решении). Это все, что мне когда-либо понадобится, и это лучший ответ.
Никос,

5

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

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

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


3
Reflector теперь стоит денег, но ILSpy сделает то же самое бесплатно.
yoyo

Существует 30-дневная бесплатная пробная версия, но нет бесплатной версии, которую можно использовать бесконечно. Если вы не знаете чего-то, чего не знаю я? Я только что проверил рефлектор.net .
йойо

1
Сожалею; Раньше Reflector все еще имел бесплатную версию. Когда от этого избавились?
SLaks 08

2 февраля 2011 г. - zdnet.com/blog/burnette/…
yoyo

3
Что действительно ужасно, так это то, что после этой даты, если вы запустили копию ранее загруженной бесплатной версии, redgate (они купили Reflector) УДАЛИЛ старую бесплатную версию, заменив ее пробной. Без всякого предупреждения. И нет возможности избежать «апгрейда». Правильно: я не заходил на сайт компании и ничего с них не скачивал. Но в старом ReSharper была логика лицензирования, которая была перенаправлена ​​им и позволила деактивировать копию, которая у меня была. Я поклялся никогда, никогда и ни при каких обстоятельствах ничего не покупать у Redgate и иным образом поощрять их существование.
ToolmakerSteve

4

Для классов Framework я использую библиотеку MSDN. Раздел «Иерархия наследования» работает в обоих направлениях. По общему признанию, это не очень помогает для некоторых сторонних библиотек.


Вот пример для System.Exception: msdn.microsoft.com/en-us/library/…
bnieland

4

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

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


1
+1 Приятно! Итак, кажется, что имена классов, выделенные жирным шрифтом в списке, напрямую наследуются от выбранного базового класса, а имена классов в списке, выделенные жирным шрифтом, косвенно наследуются от выбранного базового класса?
Саймон Босли,

В яблочко. Лысые будут непосредственно наследующими классами.
Devid


1

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


1

В качестве опции для тех, кто использует Visual Assist, вы также можете нажать Shift + ALT + G (пока курсор находится на имени класса), чтобы вызвать контекстное меню «Перейти к связанным», и если есть производные классы, вы получите подменю для этого он перечисляет их все и даже показывает структуры наследования среди этих производных классов.


0

Просто закодируйте это.

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);
}

2
К сожалению, это говорит вам только о типах, которые напрямую наследуются от определенного класса, а не о типах, которые косвенно наследуются от класса. Для этого вам, вероятно, придется использовать что-то вроде того, что написал MZN.
user420667 09

Или вы можете использовать t.IsSubClassOf (targetclass).
user420667

0

если вы обновились до VS2012, вы можете использовать «Карту кода».
Щелкните правой кнопкой мыши тип, иерархию наследования которого вы хотите просмотреть, и выберите «Добавить в карту кода». Затем в представлении карты кода вы можете развернуть узлы и щелкнуть правой кнопкой мыши, чтобы выбрать «Показать производные / базовые классы». К сожалению, это не работает для классов, предоставляемых .NET.


4
К вашему сведению, это относится только к VS2012 Ultimate с установленным обновлением 1. К сожалению, пользователи Premium / Pro не могут создавать эти карты.
Шон Хэнли

0

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

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

1
Опять же, насколько я могу судить, это покажет только производные классы, которые вы написали. Как это будет работать с примером, указанным в исходном вопросе? (Типы ActionResult)
Дэн Эспарза

0

Обновление 2020:

Вы можете использовать карты кода Visual Studio которые работают очень хорошо.

Просто щелкните правой кнопкой мыши на классе и перейдите к:
Code Map> Show Related Items on Code Map>Show All Derived Types

введите описание изображения здесь

Заметка:

  • Эта функция доступна только в корпоративной версии Visual Studio, и если у вас ее нет , вы можете получить ее бесплатно , загрузив версию Enterprise Preview отсюда. .
  • Или вы можете просто попросить кого-нибудь из вашей команды поделиться картой кода с этой функцией, если у них есть эта версия.

PS Действительно стоит сохранить версию Enterprise (или, по крайней мере, ее предварительную версию) на вашем компьютере, так как в ней есть множество действительно полезных инструментов , которые не включены в другие версии.


1
Кажется, это работает только для тех типов, для которых у вас есть исходный код. Не такие вещи, как ActionResult(пример ОП)
Иэн

-1

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


1
Это срабатывает не каждый раз, class DDerived : IInterface, BBase
учтите
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.