Visual Studio:如何显示从基类继承的所有类?

时间:2008-11-11 22:36:11

标签: visual-studio class abstract-class

在Visual Studio中,如何显示从基类继承的所有类?

例如,在ASP.NET MVC中有几种“ActionResult”类型 - 它们都继承自/实现基类ActionResult

除非您“知道”ViewJson是有效ActionResult类型,否则您无法轻易找到此信息。

请证明我错了。

对象浏览器中是否有某些内容可以让您轻松找到它?

我甚至想要获取Visual Studio之外的工具的建议来发现有关各种类的信息。例如:Resharper中有什么东西可以帮助我吗?

19 个答案:

答案 0 :(得分:128)

对于VS2012,

  1. 导航到解决方案资源管理器中的文件
  2. 展开并选择您的课程
  3. 右键单击课程项目(不是文件项目) - >派生类型

答案 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的公司。

查找派生类的步骤:

  1. 启动dotPeek
  2. 选择“从GAC打开...”并添加System.Web.MVC程序集
  3. 选择“导航/转到键入”并输入ActionResult
  4. ActionResult班级声明中,右键单击并选择“派生符号”
  5. 瞧!显示每个派生类(即使是一些我不知道的!)

答案 5 :(得分:9)

从“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/

答案 6 :(得分:7)

假设您已安装Resharper:将光标放在类/接口上,右键单击 - Inspect - Hierarchies

这显示了子类,实现和超类。

答案 7 :(得分:5)

您也可以使用Reflector

加载您想要查看的所有程序集,导航到某个类型,然后展开“派生类型”项。

您也可以在对象浏览器中执行此操作,但出于某种原因,VS2008只能在其中一个.Net Framework视图中执行此操作。 (VS2010 Beta 2可以在任何视图中执行)

答案 8 :(得分:5)

Try Visual Studio Class View

在Visual Studio类视图中导航到您感兴趣的类,并找到其基类和派生类

答案 9 :(得分:4)

对于Framework类,我使用MSDN Library。 “继承层次结构”部分指向两个方向。不过,对于某些3D派对图书馆来说,这并不是很有帮助。

答案 10 :(得分:4)

ReSharper(版本2016.1.2)的帮助下,只需 Ctrl + Alt + 在基类上单击。你会看到这样的东西:

see derived classes reSharper

答案 11 :(得分:3)

将类或命名空间从对象资源管理器拖到类图文件。

How to get a nice class diagram for built-in .net classes?

答案 12 :(得分:1)

选择类型并右键单击查看内容---在代码图上显示 - 选择它为那些继承此类型的人生成图像formet为非常好的图像为.dgml文件格式它提供了更多关于类型<的信息/ p>

答案 13 :(得分:0)

2020年更新:

您可以使用运行正常的Visual Studio的Code Maps

只需右键单击课程并导航至:
Code Map> Show Related Items on Code Map> Show All Derived Types

enter image description here

注意:

  • 此功能仅在Visual Studio企业版上仅可用,如果您没有, 您可以从here下载企业预览版,免费免费
  • 或者您可能只问团队中的任何人共享具有this功能的代码映射,如果他们有该版本。

P.S。将企业版(或至少它的预览版)保留在您的计算机中确实很值得,因为它有一堆really useful tools,而其他版本未包含。

答案 14 :(得分:0)

作为使用Visual Assist的用户的选项,你也可以按Shift + ALT + G(同时插入符号在类名称上)以显示“Goto Related”上下文菜单,如果有派生类,你将得到一个子菜单,列出它们全部,甚至显示那些派生类中的继承结构。

答案 15 :(得分:0)

对于Visual Studio 2012(没有ReSharper

  1. 在解决方案资源管理器中右键单击该类(您要查看其派生类)。
  2. 在类图中,右键单击该类并选择“显示派生类”。

答案 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并使用“查找选项/匹配整个单词”选项。 您将只找到继承的类。