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 может сделать это в любом представлении)
Ответ 9
Перетащите класс или пространство имен из Обозревателя объектов в файл Class Digram.
Как получить классную диаграмму классов для встроенных классов .net?
Ответ 10
С помощью ReSharper (версия 2016.1.2) просто Ctrl + Alt + Click на Базовый класс. Вы увидите что-то вроде этого:
![посмотреть производные классы reSharper]()
Ответ 11
Начиная с "Visual Studio 2015 Update 1" вы можете просто щелкнуть правой кнопкой мыши по имени класса в редакторе кода класса, а затем выбрать "Go To Implementation" из контекстного меню: Ctrl + F12 является ярлыком.
Подробнее см. https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/.
Ответ 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) и использовать опцию "Найти параметры/совпадение всего слова".
Вы найдете только унаследованные классы.