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

Visual Studio: How do I show all classes inherited from a base class?

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

例如,在ASP.NET MVC中有几个"actionResult"类型——它们都继承自/实现基类ActionResult

看起来,除非您"知道"ViewJson是有效的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的公司。

    查找派生类的步骤:

  • 启动Dotpeek
  • 选择"从GAC打开…"并添加system.web.mvc程序集
  • 选择"导航/转到类型"并键入ActionResult
  • ActionResult类声明中,右键单击并选择"派生符号"。
  • 喂!每一个派生类都会显示出来(即使是一些我不知道的类!)

  • 假设已经安装了Resharper:在类/接口上使用光标,右键单击-Inspect-Hierarchies

    这将显示子类、实现和超类。


    氧化镁

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


    你也可以使用反射镜。

    加载希望它查找的所有程序集,导航到类型,然后展开派生类型项。

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


    在Resharper(2016.1.2版)的帮助下,只需在基类上使用ctrl+alt+click。您将看到如下内容:

    see derived classes reSharper


    对于框架类,我使用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)中搜索: Classname并使用"查找选项/匹配整个单词"选项。您将只找到继承的类。