在Visual Studio中,如何显示从基类继承的所有类?
例如,在ASP.NET MVC中有几种“ActionResult”类型 - 它们都继承自/实现基类ActionResult
。
除非您“知道”View
和Json
是有效ActionResult
类型,否则您无法轻易找到此信息。
请证明我错了。
对象浏览器中是否有某些内容可以让您轻松找到它?
我甚至想要获取Visual Studio之外的工具的建议来发现有关各种类的信息。例如:Resharper中有什么东西可以帮助我吗?
答案 0 :(得分:128)
对于VS2012,
答案 1 :(得分:70)
您不一定需要Reflector - Visual Studio的“类图”视图也可以让您轻松找到特定类的所有派生类。右键单击“类视图”中的类,然后选择“查看类图”。如果图表未显示层次结构所需的详细程度,请右键单击图表中类的框,然后选择“显示派生类”。
可能不像Resharper那么直接,但如果你没有R#,那么这是一个选择。
不幸的是,我不确定Visual Studio的哪个特定版本有它。
答案 2 :(得分:48)
当然,Resharper可以做到这一点。还有更多。
在任何地方右键单击类型名称,然后在上下文菜单中选择“转到继承者”。 “Go To Inheritor”也可以应用于导航到覆盖的方法和接口方法的实现。对于一个接口,您可以再次调用“Find Usages Advanced”,只需右键单击)在哪里可以找到所有扩展和实现。对于类型派生类型。 我最喜欢的功能 - 点击任意类型/方法按住Control导航到其声明。
我认为它是.net开发人员必备的工具。
在Resharper 9.2中,在源代码中的任何类型上,rt-单击“查找使用高级”,选择Find =“Derived”和Scope =“Solutions and Libraries”。
例如,要查找来自任何供应商的包含DLL中的某些基类的所有继承者(包括库和代码),请在代码中使用该基类声明变量。然后右键单击刚刚键入的基类名称。
答案 3 :(得分:13)
这是最懒惰的答案(我为这个答案感到自豪:)
我没有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();
答案 4 :(得分:9)
还没有人提到这个,所以我会加上它 Jetbrains dotPeek 是一款免费的.NET反编译器,可以轻松显示此信息。
免费下载:http://www.jetbrains.com/decompiler/
Jetbrains是制造Resharper的公司。
ActionResult
ActionResult
班级声明中,右键单击并选择“派生符号”答案 5 :(得分:9)
从“Visual Studio 2015 Update 1”开始,您只需右键单击类代码编辑器中的类名,然后从上下文菜单中选择“Go To Implementation”:使用Ctrl + F12作为快捷方式。
答案 6 :(得分:7)
假设您已安装Resharper:将光标放在类/接口上,右键单击 - Inspect - Hierarchies
这显示了子类,实现和超类。
答案 7 :(得分:5)
您也可以使用Reflector。
加载您想要查看的所有程序集,导航到某个类型,然后展开“派生类型”项。
您也可以在对象浏览器中执行此操作,但出于某种原因,VS2008只能在其中一个.Net Framework视图中执行此操作。 (VS2010 Beta 2可以在任何视图中执行)
答案 8 :(得分:5)
答案 9 :(得分:4)
对于Framework类,我使用MSDN Library。 “继承层次结构”部分指向两个方向。不过,对于某些3D派对图书馆来说,这并不是很有帮助。
答案 10 :(得分:4)
在ReSharper(版本2016.1.2)的帮助下,只需 Ctrl + Alt + 在基类上单击。你会看到这样的东西:
答案 11 :(得分:3)
将类或命名空间从
答案 12 :(得分:1)
选择类型并右键单击查看内容---在代码图上显示 - 选择它为那些继承此类型的人生成图像formet为非常好的图像为.dgml文件格式它提供了更多关于类型<的信息/ p>
答案 13 :(得分:0)
2020年更新:
您可以使用运行正常的Visual Studio的Code Maps。
只需右键单击课程并导航至:
Code Map
> Show Related Items on Code Map
> Show All Derived Types
注意:
P.S。将企业版(或至少它的预览版)保留在您的计算机中确实很值得,因为它有一堆really useful tools,而其他版本未包含。
答案 14 :(得分:0)
作为使用Visual Assist的用户的选项,你也可以按Shift + ALT + G(同时插入符号在类名称上)以显示“Goto Related”上下文菜单,如果有派生类,你将得到一个子菜单,列出它们全部,甚至显示那些派生类中的继承结构。
答案 15 :(得分:0)
对于Visual Studio 2012(没有ReSharper )
答案 16 :(得分:0)
如果您升级到VS2012,则可以使用“代码映射” 右键单击要查看继承层次结构的类型,然后选择“添加到代码映射”。 然后在代码映射视图中,您可以展开节点并右键单击以选择“Show Derived / Base classes”。 不幸的是,它不适用于.NET提供的类。
答案 17 :(得分: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);
}
答案 18 :(得分:-1)
一种非常简单的方法是在“查找和替换窗口”(CTRL + F)中搜索: Classname
并使用“查找选项/匹配整个单词”选项。
您将只找到继承的类。