Visual Studio: Як відобразити всі класи, успадковані від базового класу?


139

Як у візуальній студії відображаються всі класи, успадковані від базового класу?

Наприклад , в 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" не працюватиме для будь-якого коду, який я використовую в зборі.
Дан Еспарза

Відповіді:


50

Звичайно, Resharper може це зробити. І набагато більше.

Просто клацніть правою кнопкою миші на введіть ім'я в будь-якому місці та виберіть "Перейти до спадкоємця" у контекстному меню. "Перейти до спадкоємця" також можна застосувати до методу навігації до переопределень та реалізації методу інтерфейсу. Для інтерфейсу ви можете знову зателефонувати "Знайти розширення користування", просто клацніть правою кнопкою миші), де знайти усі розширення та реалізації. Для типів - похідних типів. І моя улюблена функція - клацніть, утримуючи клавішу Control на будь-якому типі / методі для навігації до її декларації.

Я думаю, що це обов'язковий інструмент для розробників .net.


У Resharper 9.2 на будь-якому типі вихідного коду натисніть rt і натисніть «Знайти використання розширеного», виберіть Find = «Похідне» та Scope = «Рішення та бібліотеки».
Наприклад, щоб знайти усіх спадкоємців (як у бібліотеці, так і у вашому коді) якогось базового класу у включеній DLL від будь-якого постачальника, оголосити змінну у своєму коді з цим базовим класом. Потім клацніть правою кнопкою миші те саме ім'я базового класу, яке ви ввели.


6
Який сором. Java-розробники, які використовують безкоштовний Eclipse, мають цю функціональність поза коробкою. У моєму Resharper + VS2015 я бачу "перейти до впровадження", а не "Перейти до спадкоємця".
Північний полюс

1
Але це не дає мені занять у середині, лише залишає. CTRL + ALT + B дасть відповідь.
Північний полюс

2
Visual Studio 6 мав це на проектах C ++ майже 20 років тому. Веб-браузер та діаграма класів не забезпечують однакової легкої ваги для перевертання дерев спадкування. Нещодавно я виявив, що Eclipse має чудову версію цього, принаймні на Java. Давайте, MS, телефонуйте до одного з колишніх розробників і запитайте, що це було, але ви втратили .... Згідно з цим, потрібно, щоб усі проекти мали можливість генерувати дані BSC для перегляду даних після опції компіляції, але це було нормально. Це було насправді.
Філіп Бек

150

Для VS2012,

  1. Перейдіть до файлу в Explorer Explorer
  2. Розгорніть і виберіть свій клас
  3. Клацніть правою кнопкою миші елемент класу (не елемент файлу) -> Похідні типи

9
Це передбачає вихідний код, який ви написали. Як би це працювало на прикладі, зазначеному в оригінальному запитанні? (Типи ActionResult)
Dan Esparza

Якщо у вас є будь-який тип, що походить від ActionResult, ви можете клацнути правою кнопкою миші на своєму типі та вибрати базові типи, які перейдуть до ActionResult, на який ви можете зараз клацнути правою кнопкою миші та вибрати похідні типи. (Якщо у вас немає типу, який походить від ActionResult, тоді ви могли б повернутись до System.Object, а потім вниз до ActionResult.)
yoyo

21
Для тих із вас, хто, як і я, клацнув правою кнопкою миші на файл коду класу та наткнувся на те, чому не було опції меню "похідні типи": пригадайте, що спочатку потрібно розгорнути елемент файлу коду, щоб виявити елемент класу - потім клацніть правою кнопкою миші.
BCA

3
Я використовую VS 2017. На жаль, це показує лише класи, які існують в одній збірці, не показує все рішення.
NightOwl888

4
Дивно, як ця функціональність існує в Провіднику рішень, але не Класовому представленні.
Дай

73

Для цього вам не обов'язково потрібен Reflector - перегляд «Діаграма класів» Visual Studio дозволить вам легко знайти всі похідні класи для певного класу. Клацніть правою клавішею класу в "Перегляд класу" і виберіть "Переглянути діаграму класів". Якщо на діаграмі не відображається потрібний рівень ієрархії, клацніть правою кнопкою миші поле для класу на діаграмі та виберіть "Показати отримані класи".

Може бути не таким прямим, як Resharper, але це варіант, якщо у вас ще немає R #.

На жаль, я не впевнений, які саме версії Visual Studio мають.


15
Це дозволить лише переглядати класи у вашому рішенні, які успадковують / реалізують цільовий клас / інтерфейс. Добре знати, хоча.
Маркус Джардеро

Чи знаєте ви про обмеження цього методу? Оскільки це не дозволяє мені бачити всі підкласи (схоже, він показує лише підкласи, які не реалізують додаткових інтерфейсів).
Серж

1
Я отримав помилку, кажучи: "У поточному проекті немає типів, які походять від XXX", тому я думаю, що це обмежено типами в поточному проекті, а не рішенням
Енді

Чи можу я виконувати "Показувати похідні класи" рекурсивно? Або я повинен вибрати "Показувати похідні класи" на кожному підкласі чітко?
Джеймс Wierzba

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
Також: Я досить впевнений, що це функція, яку надає Решарпер, вона не є споконвічно в Visual Studio ...
Dan Esparza

7

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

У Visual Studio Class View перейдіть до класу, який вас цікавить, і знайдіть його базові та похідні класи


3
Це насправді потенційно корисний вигляд. На жаль, це неймовірно повільно, не посилається / не слідкує за поточним редактором і, як правило, відчуває себе замисленим у VS.
E-Riz

Це показує всі класи, не лише ті, які є у вашому рішенні, і працює прямо з коробки. Це не повільно. Для більш графічного перегляду використовуйте також вбудовану функцію Діаграма класів (але вона відображає лише класи у вашому рішенні). Це все, що мені колись знадобиться, і це найкраща відповідь.
Нікос

5

Ви також можете використовувати Reflector .

Завантажте всі збірки, на яких ви хочете, щоб вони заглянули, перейдіть до типу та розгорніть елемент Похідні типи.

Ви також можете це зробити в браузері об’єктів, але чомусь VS2008 може це зробити лише в одному з представлень .Net Framework. (VS2010 Beta 2 може це зробити в будь-якому режимі)


3
Зараз рефлектор коштує грошей, але ILSpy зробить те саме безкоштовно.
yoyo

Існує 30-денна безкоштовна пробна версія, але жодну безкоштовну версію ви не можете використовувати безстроково. Якщо ви не знаєте чогось, чого я не знаю? Я щойно перевірив reflector.net .
yoyo

1
Вибачте; Reflector раніше мав безкоштовне видання. Коли вони його позбулися?
СЛАкс

2 лютого 2011 р. - zdnet.com/blog/burnette/…
yoyo

3
Що було справді жахливим, це те, що після цієї дати, якщо ви запустили копію завантаженої раніше безкоштовної версії, redgate (вони купили Reflector) ВИДАЛИЛИ стару безкоштовну версію, замінивши її на пробну. Без жодного попередження. І жодного варіанту уникнути "оновлення". Правильно: я не зайшов на веб-сайт компанії і нічого з них не завантажив. Але в старому ReSharper була перетворена логіка ліцензування, яка дозволила їм деактивувати копію, яку я мав. Я пообіцяв ніколи і ніколи, ні за яких обставин не купувати щось у Redgate або іншим чином заохочувати їх існування.
ToolmakerSteve

4

Для класів Framework використовую бібліотеку MSDN. Розділ Ієрархія спадщини йде в обох напрямках. Хоча, правда, не дуже допомагають деякі бібліотеки 3d-учасників.


Ось приклад для System.Exception: msdn.microsoft.com/en-us/library/…
bnieland

4

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

див. похідні класи reSharper


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

Саме так. Лисий буде безпосередньо успадковувати класи.
Девід


1

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


1

Як варіант для тих, хто використовує Visual Assist, ви також можете натиснути Shift + ALT + G (у той час як карета вказана на назві класу), щоб відкрити контекстне меню "Goto Related", і якщо є похідні класи, ви отримаєте підменю для цього, що перераховує їх усіх, і навіть показує структури успадкування серед цих похідних класів.


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

Або ви можете використовувати t.IsSubClassOf (targetclass).
user420667

0

якщо ви оновили до VS2012, ви можете скористатися "Кодовою картою".
Клацніть правою кнопкою миші на тип, який ви хочете, щоб переглянути ієрархію спадкування та виберіть "Додати в карту коду". Потім у вікні карти коду можна розгорнути вузли та клацнути правою кнопкою миші, щоб вибрати "Показати отримані / базові класи". На жаль, це не працює для класів, передбачених .NET.


4
FYI для будь-кого іншого, це стосується лише VS2012 Ultimate з встановленим оновленням 1. На жаль, люди Premium / Pro не можуть створити ці карти, на жаль.
Шон Хенлі

0

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

  1. У Провіднику рішень клацніть правою клавішею класу (чиї похідні класи ви хочете бачити).
  2. На діаграмі класів клацніть правою клавішею класу та виберіть "Показати похідні класи".

1
Знову ж таки, наскільки я можу сказати, це покаже лише похідні класи, які ви написали. Як би це працювало на прикладі, зазначеному в оригінальному запитанні? (Типи ActionResult)
Dan Esparza

0

Оновлення до 2020 року:

Ви можете використовувати кодові карти Visual Studio, що працює дуже добре.

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

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

Примітка:

  • Ця функція доступна лише в Enterprise Edition Visual Studio, і якщо у вас її немає , ви можете отримати її безкоштовно , завантаживши тут версію Enterprise Preview .
  • Або ви можете просто попросити когось із вашої команди поділитися картою коду з цією функцією, якщо вони мають це видання.

PS Дійсно варто зберігати версію Enterprise (або принаймні попередню версію її версії) у вашій машині, оскільки вона має купу дійсно корисних інструментів , які не входять до інших видань.


1
Здається, це працює лише для типів, для яких є джерело. Не такі речі, як ActionResult(приклад ОП)
Іан

-1

Дуже простий спосіб зробити це - здійснити пошук : Classnameу вікні «Знайти та замінити» (CTRL + F) та використати варіант «Знайти параметри / зіставити ціле слово». Ви знайдете лише успадковані класи.


1
Це працює не кожен раз, врахуйтеclass DDerived : IInterface, BBase
jirkamat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.