在Visual Studio中,如何显示从基类继承的所有类?
例如,在ASP.NET MVC中有几种" ActionResult "类型 - 它们都继承自/实现基类ActionResult
.
看起来除非你只是"知道" View
并且Json
是有效的ActionResult
类型,否则你无法轻易找到这些信息.
请证明我错了.
对象浏览器中有什么东西可以让这个很容易找到吗?
我甚至想在Visual Studio之外寻找工具的建议来发现有关各种类的信息.例如:Resharper中有什么东西可以帮助我吗?
对于VS2012,
导航到解决方案资源管理器中的文件
展开并选择您的课程
右键单击类项(不是文件项) - >派生类型
您不一定需要Reflector - Visual Studio的"类图"视图也可以让您轻松找到特定类的所有派生类.右键单击"类视图"中的类,然后选择"查看类图".如果图表未显示层次结构所需的详细程度,请右键单击图表中类的框,然后选择"显示派生类".
可能不如Resharper那么直接,但如果你没有R#,那么这是一个选择.
不幸的是,我不确定Visual Studio的哪个特定版本具有它.
当然,Resharper可以做到这一点.以及更多.
只需在任何位置右键单击类型名称,然后在上下文菜单中选择"转到继承者"."Go To Inheritor"也可以应用于导航到覆盖的方法和接口方法的实现.对于一个接口,您可以再次调用"Find Usages Advanced",只需右键单击)在哪里可以找到所有扩展和实现.对于类型派生类型.我最喜欢的功能 - 点击任意类型/方法按住Control导航到其声明.
我认为它是.net开发人员必备的工具.
在Resharper 9.2中,在源代码中的任何类型上,单击"查找使用高级",然后选择Find ="Derived"和Scope ="Solutions and Libraries".
例如,要查找来自任何供应商的包含DLL中的某些基类的所有继承者(包括库和代码),请在代码中使用该基类声明变量.然后右键单击刚刚键入的基类名称.
这是最懒惰的答案(我为这个答案感到自豪:)
我没有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 typeTreeDictionary = new Dictionary();
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"开始,您只需在类代码编辑器中右键单击类名,然后从上下文菜单中选择"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/.
还没有人提到这个,所以我会加上它.
Jetbrains dotPeek是一款免费的.NET反编译器,可以轻松显示这些信息.
免费下载:http://www.jetbrains.com/decompiler/
Jetbrains是制造Resharper的公司.
启动dotPeek
选择"从GAC打开..."并添加System.Web.MVC程序集
选择"导航/转到键入"并输入 ActionResult
在ActionResult
类声明中,右键单击并选择"派生符号"
瞧!显示每个派生类(即使是一些我不知道的!)
假设您安装了Resharper:在类/接口上使用光标,右键单击 - Inspect - Hierarchies
这显示了子类,实现和超类.
在Visual Studio类视图中,导航到您感兴趣的类,并找到其基类和派生类
您也可以使用Reflector.
加载要查看的所有程序集,导航到类型,然后展开"派生类型"项.
您也可以在对象浏览器中执行此操作,但出于某种原因,VS2008只能在其中一个.Net Framework视图中执行此操作.(VS2010 Beta 2可以在任何视图中执行)