158

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

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

看起来除非您只是“知道”View并且Json是有效ActionResult类型,否则您无法轻松找到此信息。

请证明我错了。

对象浏览器中有什么东西可以很容易找到吗?

我什至愿意为 Visual Studio 之外的工具提供建议,以发现有关各种类的这些信息。例如:Resharper 中有什么可以帮助我的吗?

4

19 回答 19

171

对于 VS2012,

  1. 在解决方案资源管理器中导航到文件
  2. 展开并选择您的班级
  3. 右键单击类项(不是文件项)-> 派生类型
于 2013-06-29T01:53:12.963 回答
74

您不一定需要 Reflector - Visual Studio 的“类图”视图也可以让您轻松找到特定类的所有派生类。右键单击“类视图”中的类,然后选择“查看类图”。如果图表没有显示层次结构所需的详细级别,请右键单击图表中类的框,然后选择“显示派生类”。

可能不像 ReSharper 那样直接,但如果您还没有 R#,它是一个选项。

不幸的是,我不确定 Visual Studio 的哪个特定版本有它。

于 2011-01-25T08:37:25.657 回答
48

当然,Resharper可以做到这一点。以及更多。

只需在任意位置右键单击类型名称,然后在上下文菜单中选择“转到继承者”。“Go To Inheritor”也可以应用于导航到覆盖的方法和接口方法的实现。对于一个界面,您可以再次调用“Find Usages Advanced”,只需右键单击)在哪里可以找到所有扩展和实现。对于一个类型 - 派生类型。还有我最喜欢的功能 - 在任何类型/方法上按住 Control 单击以导航到其声明。

我认为它是.net 开发人员必备的工具。


在 Resharper 9.2 中,在源代码中的任何类型上,右键单击“Find Usage Advanced”,选择 Find="Derived" 和 Scope="Solutions and Libraries"。
例如,要在来自任何供应商的包含的 DLL 中查找某个基类的所有继承者(在库和您的代码中),请在您的代码中使用该基类声明一个变量。然后右键单击您刚刚键入的基类名称。

于 2008-11-11T22:40:32.020 回答
18

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

于 2017-06-16T08:36:29.813 回答
14

这是最不懒惰的答案(我只是为这个答案感到自豪:)

我没有 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();
于 2012-06-26T15:26:05.340 回答
10

还没有人提到这个,所以我会添加它。
Jetbrains dotPeek是一款免费的 .NET 反编译器,能够轻松显示这些信息。

免费下载: http: //www.jetbrains.com/decompiler/

Jetbrains 是制造 Resharper 的公司。

查找派生类的步骤:

  1. 启动 dotPeek
  2. 选择“从 GAC 打开...”并添加 System.Web.MVC 程序集
  3. 选择“导航/转到输入”并输入ActionResult
  4. ActionResult类声明上,右键单击并选择“派生符号”
  5. 瞧!显示了每个派生类(即使是一些我不知道的!)
于 2012-08-07T15:30:59.890 回答
7

假设您安装了Resharper:将光标放在类/接口上,右键单击 - 检查 - 层次结构

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

于 2012-10-19T15:34:04.533 回答
7

尝试 Visual Studio 类视图

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

于 2017-04-29T13:24:51.153 回答
5

您也可以使用反射器

加载您希望它查看的所有程序集,导航到一个类型,然后展开 Derived Types 项。

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

于 2009-11-03T04:05:35.057 回答
4

对于框架类,我使用 MSDN 库。Inheritance Hierarchy 部分是双向的。诚然,对于某些 3d 派对库来说帮助不大。

于 2008-11-11T22:51:16.070 回答
4

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

查看派生类 reSharper

于 2016-08-09T08:47:13.293 回答
3

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

如何为内置的 .net 类获得漂亮的类图?

于 2011-12-28T10:59:17.800 回答
2

作为使用 Visual Assist 的一个选项,您还可以按 Shift + ALT + G(插入符号位于类名上)以调出“转到相关”上下文菜单,如果有派生类,您将获得一个子菜单因为它列出了它们,甚至显示了这些派生类之间的继承结构。

于 2018-02-13T18:46:59.900 回答
1

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

于 2015-01-08T08:15:38.207 回答
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);
}
于 2012-08-08T15:04:42.550 回答
0

如果您升级到 VS2012,您可以使用“代码图”。
右键单击要查看其继承层次结构的类型,然后选择“添加到代码映射”。然后在代码图视图中,您可以展开节点并右键单击以选择“显示派生/基类”。不幸的是,它不适用于 .NET 提供的类。

于 2013-02-21T22:29:43.240 回答
0

对于 Visual Studio 2012(没有 ReSharper

  1. 在解决方案资源管理器中,右键单击类(您要查看其派生类)。
  2. 在类图中,右键单击类并选择“显示派生类”。
于 2013-09-18T12:39:42.980 回答
0

2020年更新:

您可以使用 Visual Studio 的代码映射,它工作得很好。

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

在此处输入图像描述

笔记:

  • 此功能在 Visual Studio 的企业版上可用,如果您没有,可以通过从此处下载企业预览版免费获得。
  • 或者,您可能只要求团队中的任何人使用功能共享代码图,如果他们有该版本。

PS 在您的机器中保留企业版(或至少是预览版)真的很值得,因为它有很多其他版本中不包含的非常有用的工具。

于 2020-04-16T11:17:04.153 回答
-1

一个非常简单的方法是: Classname在“查找和替换窗口”(CTRL + F)中搜索并使用“查找选项/匹配整个单词”选项。您只会找到继承的类。

于 2015-04-30T11:26:54.643 回答