Visual Studio: How do I show all classes inherited from a base class?
在Visual Studio中,如何显示从基类继承的所有类?
例如,在ASP.NET MVC中有几个"actionResult"类型——它们都继承自/实现基类
看起来,除非您"知道"
请证明我错了。
对象浏览器中有什么东西可以让您很容易地找到吗?
我甚至想听听关于Visual Studio之外的工具的建议,以了解有关各种类的信息。例如:Resharper中有什么可以帮助我的吗?
对于VS2012,
您不一定需要这个反射镜-Visual Studio的"类图"视图也可以让您轻松地找到特定类的所有派生类。右键单击"类视图"中的类,然后选择"查看类图"。如果图表未显示层次结构所需的详细级别,请右键单击图表中类的框,然后选择"显示派生类"。
可能不像Resharper那样直接,但如果您还没有R的话,这是一个选项。
不幸的是,我不确定哪个特定版本的Visual Studio具有它。
当然,Resharper可以做到这一点。还有更多。
只需在任何地方右键单击类型名称,然后在上下文菜单中选择"转到继承者"。"转到继承器"也可以应用于导航到重写的方法和接口方法的实现。对于一个接口,您可以再次调用"查找高级用法",只需右键单击)在哪里查找所有扩展和实现。对于派生类型。以及我最喜欢的功能——单击并保持对任何类型/方法的控制以导航到其声明。
我认为它是.NET开发人员必备的工具。
在Resharper 9.2中,在任何类型的源代码上,rt单击"Find usage advanced",选择find="derived"和scope="solutions and libraries"。例如,要从任何供应商在包含的dll中查找某个基类的所有继承者(库和代码中),请在代码中用该基类声明一个变量。然后右键单击刚才键入的基类名。
这是最不懒惰的答案(我为这个答案感到骄傲:)
我没有弹琴,以前试过,但不想买。我尝试了一个类图,但根本不实用,因为层次图跨越世界三倍以上,我的笔记本电脑屏幕没有无限宽。因此,我自然而简单的解决方案是编写一些Windows窗体代码,以迭代程序集中的类型,并使用反射将节点添加到树视图中,如下所示:
请假设在运行此代码的表单上有文本框、树视图和其他所需内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | //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更新1"开始,您只需在类代码编辑器中右键单击类名,然后从上下文菜单中选择"转到实现":快捷方式为ctrl+f12。
有关详细信息,请参阅https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/。
还没有人提到这一点,所以我要补充一点。JetBrains Dotpeek是一款免费的.NET反编译程序,它能够轻松显示这些信息。
免费下载:http://www.jetbrains.com/decompiler/
JetBrains是生产Resharper的公司。
查找派生类的步骤:假设已经安装了Resharper:在类/接口上使用光标,右键单击-Inspect-Hierarchies
这将显示子类、实现和超类。
氧化镁
在Visual Studio类视图中,导航到您感兴趣的类,并找到其基类和派生类
你也可以使用反射镜。
加载希望它查找的所有程序集,导航到类型,然后展开派生类型项。
也可以在对象浏览器中执行此操作,但出于某种原因,VS2008只能在某个.NET框架视图中执行此操作。(VS2010 Beta 2可以在任何视图中执行此操作)
在Resharper(2016.1.2版)的帮助下,只需在基类上使用ctrl+alt+click。您将看到如下内容:
。
对于框架类,我使用msdn库。继承层次结构部分是双向的。当然,对于一些3D党校图书馆来说,没有什么帮助。
将类或命名空间从对象资源管理器拖动到类digram文件。
如何获得内置.NET类的良好类图?
选择类型并右键单击"查看某个内容"--在代码图上显示"--选项选择它为继承此类型的人生成图像格式和.dgml文件格式一样好。它提供了关于类型的更多信息
如果升级到VS2012,可以使用"代码映射"。右键单击要查看其继承层次结构的类型,然后选择"添加到代码映射"。然后在"代码映射"视图中,可以展开节点并右键单击选择"显示派生/基类"。不幸的是,它不适用于.NET提供的类。
作为使用视觉辅助的选项,您也可以按shift+alt+g(插入符号在类名上)打开"goto相关"上下文菜单,如果有派生类,您将得到一个子菜单,其中列出了所有类,甚至显示了tho之间的继承结构。SE派生类。
对于Visual Studio 2012(不带Resharper)
只需编写代码。
1 2 3 4 5 6 7 8 9 10 11 | 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); } |
号
一个非常简单的方法是在"查找和替换窗口"(ctrl+f)中搜索