视觉工作室:如何显示从基类继承的所有类?
-
08-07-2019 - |
题
在 Visual Studio 中,如何显示从基类继承的所有类?
例如, ,在 ASP.NET MVC 中有几个 '动作结果' 类型——它们都继承/实现基类 ActionResult
.
看起来除非你只是“知道” View
和 Json
有效 ActionResult
类型,您无法轻松找到此信息。
请证明我错了。
对象浏览器中是否有一些东西可以让这很容易找到?
我什至寻求 Visual Studio 之外的工具建议,以发现有关各种类的信息。例如:Resharper 中有什么可以帮助我的吗?
解决方案
当然, Resharper 可以做到这一点。还有更多。
在任何地方右键单击类型名称,然后选择“转到继承者”在上下文菜单中。 “Go To Inheritor”也可以应用于导航到覆盖的方法和接口方法的实现。对于接口,您可以调用“Find Usages Advanced”。再次,右键单击)在哪里可以找到所有扩展和实现。对于类型派生类型。 我最喜欢的功能 - 点击任意类型/方法按住Control导航到其声明。
我认为它是.net开发人员必备的工具。
在Resharper 9.2中,在源代码中的任何类型上,rt-click“Find Usage Advanced”,选择Find =" Derived"和范围=“解决方案和图书馆”。
例如,要查找来自任何供应商的包含DLL中的某些基类的所有继承者(包括库和代码),请在代码中使用该基类声明变量。然后右键单击刚刚键入的基类名称。
其他提示
对于VS2012,
- 导航到解决方案资源管理器中的文件
- 展开并选择您的课程
- 右键单击课程项目(不是文件项目) - >派生类型 醇>
你不一定需要Reflector - Visual Studio的“Class Diagram” view还可以让您轻松找到特定类的所有派生类。右键单击“类视图”中的类。并选择“查看类图”。如果图表未显示层次结构所需的详细程度,请右键单击图表中类的框,然后选择“显示派生类”。
可能不像Resharper那么直接,但如果你没有R#,那么这是一个选择。
不幸的是,我不确定Visual Studio的哪个特定版本有它。
这是最懒惰的答案(我为这个答案感到自豪:)
我没有ReSharper,之前尝试过,但不想买它。 我尝试了一个类图,但实际上并不实用,因为层次结构图横跨世界3次,而我的笔记本电脑屏幕没有无限宽度。 因此,我自然而简单的解决方案是编写一些Windows窗体代码来迭代程序集中的类型,并使用反射将节点添加到树视图中,如下所示:
请假设您有一个文本框,树视图以及运行此代码的表单上所需的其他内容
//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();
从“Visual Studio 2015 Update 1”开始,您只需右键单击类代码编辑器中的类名,然后选择“转到实现”即可。从上下文菜单中:使用Ctrl + F12作为快捷方式。
还没人提到这一点,所以我来补充一下。
Jetbrains dotPeek 是一个免费的 .NET 反编译器,能够轻松显示此信息。
免费下载: http://www.jetbrains.com/decompiler/
Jetbrains 是 Resharper 的开发公司。
查找派生类的步骤:
- 启动 dotPeek
- 选择“从 GAC 打开...”并添加 System.Web.MVC 程序集
- 选择“导航/转到类型”并输入
ActionResult
- 上
ActionResult
类声明,右键单击并选择“派生符号” - 瞧!显示了每个派生类(甚至有一些我不知道的!)
假设您安装了 Resharper :右键单击 - Inspect - 层次结构
这显示了子类,实现和超类。
您也可以使用反射器。
加载您想要查看的所有程序集,导航到某个类型,然后展开“派生类型”项。
您也可以在对象浏览器中执行此操作,但出于某种原因,VS2008只能在其中一个.Net Framework视图中执行此操作。 (VS2010 Beta 2可以在任何视图中执行)
对于Framework类,我使用MSDN Library。 “继承层次结构”部分指向两个方向。不过,对于某些3D派对图书馆来说,这并不是很有帮助。
在 ReSharper (版本2016.1.2)的帮助下,只需 Ctrl + Alt + 单击基类上的。你会看到这样的东西:
将类或命名空间从对象资源管理器拖到类Digram 文件。
选择类型并右键单击查看内容---在代码图上显示 - 选择它为那些继承此类型的人生成图像formet为非常好的图像为.dgml文件格式它提供了更多关于类型<的信息/ p>
只需编码即可。
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);
}
如果您升级到VS2012,则可以使用“代码映射”。
右键单击要查看继承层次结构的类型,然后选择“添加到代码映射”。
然后在代码映射视图中,您可以展开节点并右键单击以选择“Show Derived / Base classes”。
不幸的是,它不适用于.NET提供的类。
对于Visual Studio 2012(没有ReSharper )
- 在解决方案资源管理器中右键单击该类(您要查看其派生类)。
- 在类图中,右键单击该类并选择“显示派生类”。 醇>
作为使用Visual Assist的用户的选项,您也可以按Shift + ALT + G(同时插入符号在类名称上)以显示“Goto Related”。上下文菜单,如果有派生类,你将得到一个子菜单,列出它们全部,甚至显示这些派生类之间的继承结构。
一种非常简单的方法是在“查找和替换窗口”中搜索:Classname
。 (CTRL + F)并使用“查找选项/匹配整个单词”选项。
您将只找到继承的类。