【问题标题】:Visual Studio: How do I show all classes inherited from a base class?Visual Studio:如何显示从基类继承的所有类?
【发布时间】:2010-09-21 21:28:51
【问题描述】:

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

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

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

请证明我错了。

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

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

【问题讨论】:

  • 使用 Visual C# 2010 Express 我搜索“:ActionResult”的解决方案。不理想,但总比没有好。
  • 我想你误解了我的问题。 JsonResult(参考这里:msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx)继承自 ActionResult。还有几个其他类继承自 ActionResult。有什么简单的方法可以查看所有继承自 ActionResult 的类?
  • 在这种情况下,我使用的代码不是直接出现在我的解决方案中的代码。它们是另一个程序集中的 MVC 框架类。搜索“:ActionResult”不适用于我从程序集中使用的任何代码。

标签: visual-studio class abstract-class


【解决方案1】:

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

【讨论】:

  • 这实际上是一个潜在有用的视图。可悲的是,它非常慢,不链接/跟随当前编辑器,而且在 VS 中通常感觉像是事后的想法。
  • 这会显示所有类,而不仅仅是解决方案中的类,并且开箱即用。这并不慢。对于更类似于图形的视图,也可以使用类图内置功能(但仅在您的解决方案中显示类)。这就是我所需要的,这是最好的答案。
  • 为什么我只有基本类型,而不是派生类型,即使我确定它们存在?解决方案资源管理器确实有派生类型...?!我想我需要终极版。
【解决方案2】:

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

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

很遗憾,我不确定 Visual Studio 的特定版本有它。

【讨论】:

  • 这只会让您查看解决方案中继承/实现目标类/接口的类。不过很高兴知道。
  • 你知道这种方法的局限性吗?因为它不允许我看到所有的子类(它似乎只显示了没有实现任何额外接口的子类)。
  • 我得到一个错误说“当前项目中没有从XXX派生的类型”,所以我认为它仅限于当前项目中的类型,而不是解决方案
  • 我可以递归地执行“显示派生类”吗?还是我必须在每个子类上明确选择“显示派生类”?
【解决方案3】:

2020 年更新:

您可以使用 Visual Studio 的 Code Maps,它工作得很好。

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

注意:

  • 此功能在 Visual Studio 的企业版中可用,如果您没有, 您可以通过从here 下载企业预览版免费获得它。
  • 或者,您也可以让团队中的任何人使用 this 功能分享代码图(如果他们有该版本)。

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

【讨论】:

  • 这似乎只适用于你有来源的类型。不是ActionResult(OP 的例子)之类的东西
【解决方案4】:

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

我没有 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();

【讨论】:

  • +1 获取一个很酷的代码示例。其他程序集中的基类和派生类呢?
  • @ToolmakerSteve,AppDomain.CurrentDomain.GetAssemblies() 怎么样?看看这个:stackoverflow.com/questions/851248/…
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    从“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/ 了解更多详情。

    【讨论】:

    • 我很欣赏这个提示,但我不确定这是否解决了我从基类查看所有继承类的原始用例。
    • @DanEsparza:确实如此,至少在 VS2017 中是这样。所以我赞成答案
    • 很好。不幸的是,没有显示层次结构树...我只是列出了同一树级别的所有内容。
    • 和往常一样,这个名字是假的,在我搜索/使用的过程中完全忽略了它,不得不来 StackOverflow 找到它!
    • 完美!列出我熟悉的“参考”面板中的所有子类。但是我也完全忽略了它,我仍然不明白为什么“去实现”应该意味着“列出所有子类”,但是我们在这里。
    【解决方案7】:

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

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

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


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

    【讨论】:

    • 真可惜。使用免费 Eclipse 的 Java 开发人员可以立即使用此功能。在我的 Resharper + VS2015 中,我看到的是“转到实施”而不是“转到继承者”。
    • 但这并没有给我中间的课程,只有离开。 CTRL+ALT+B 会给出答案。
    • 近 20 年前,Visual Studio 6 在 C++ 项目中使用了它。对象浏览器和类图不提供同样轻量级的翻转继承树的能力。我最近发现 Eclipse 有一个很棒的版本,至少是 Java。来吧,MS,打电话给你的一位前开发人员,询问你有什么但丢失了……当然,它要求所有项目在编译选项后都有生成 BSC 浏览数据,但这很好。确实如此。
    【解决方案8】:

    ReSharper(2016.1.2 版)的帮助下,只需 Ctrl+Alt+单击 即可。你会看到这样的东西:

    【讨论】:

    • +1 不错!因此,列表中以粗体显示的类名似乎是直接从所选基类继承的,而列表中非粗体的类名是间接从选定的基类继承?
    • 没错。 Bald 将是直接继承的类。
    【解决方案9】:

    对于 VS2012,

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

    【讨论】:

    • 这假定您编写了源代码。这将如何与原始问题中所述的示例一起使用? (ActionResult 类型)
    • 如果您有任何派生自 ActionResult 的类型,那么您可以右键单击您的类型并选择 Base Types,这会将您带到 ActionResult,您现在可以右键单击并选择 Derived Types . (如果您没有派生自 ActionResult 的类型,那么您可以返回 System.Object,然后再返回 ActionResult。)
    • 对于那些像我一样右键单击类的代码文件并为为什么没有“派生类型”菜单选项感到困惑的人:请记住,您必须首先展开代码文件项显示类项目 - 然后右键单击。
    • 我正在使用 VS 2017。不幸的是,这仅显示了存在于同一程序集中的类,并没有显示整个解决方案。
    • 该功能在 VS2019 中不再存在。我只是将 VS2017 和 VS2019 并排打开,可以在 '17 版本中找到“派生类型”,但在 '19 版本中找不到。 :/您能否更新2019版的答案?派生类型已在 类视图 中移动。展开您的班级以查看两个文件夹:“Base Types”和“Derived Types”。
    【解决方案10】:

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

    【讨论】:

    • 这不是每次都有效,考虑class DDerived : IInterface, BBase
    【解决方案11】:

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

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

    Jetbrains 是制造 Resharper 的公司。

    查找派生类的步骤:

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

    【讨论】:

      【解决方案12】:

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

      【讨论】:

        【解决方案13】:

        对于 Visual Studio 2012(不带 ReSharper

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

        【讨论】:

        • 再一次,据我所知,这只会显示您编写的派生类。这将如何与原始问题中所述的示例一起使用? (ActionResult 类型)
        【解决方案14】:

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

        【讨论】:

        • 仅供参考,这仅适用于安装了 Update 1 的 VS2012 Ultimate。不幸的是,高级/专业人士无法创建这些地图。
        【解决方案15】:

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

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

        【讨论】:

        • 嗯...有趣,但不是我想要的。如果我右键单击返回的 ActionResult 项并按照以下步骤操作,我将获得“Controller”(包含类的类型)的“Inspect”选项。如果我尝试转到“ViewResult”定义,我在元数据中并且没有检查层次结构的选项。
        • 另外:我很确定这是 Resharper 提供的功能,它不是 Visual Studio 原生提供的...
        【解决方案16】:

        只需编码即可。

        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);
        }
        

        【讨论】:

        • 不幸的是,这只会告诉您直接从特定类继承的类型,而不是从类间接继承的类型。为此,您可能必须使用类似 MZN 所写的内容。
        • 或者你可以使用 t.IsSubClassOf(targetclass)。
        【解决方案17】:

        将类或命名空间从Object Explorer拖到Class Digram文件。

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

        【讨论】:

        • 检查链接的答案,其中显示了屏幕截图的步骤
        【解决方案18】:

        您也可以使用Reflector

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

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

        【讨论】:

        • Reflector 现在需要花钱,但 ILSpy 会免费提供。
        • 有 30 天的免费试用期,但没有可以无限期使用的免费版本。除非你知道我不知道的事?我刚刚检查了reflector.net
        • 对不起; Reflector 过去仍然有免费版。他们什么时候摆脱它的?
        • 2011 年 2 月 2 日 -- zdnet.com/blog/burnette/…
        • 真正可怕的是,在那之后,如果您运行之前下载的免费版本的副本,redgate(他们购买了 Reflector)删除了旧的免费版本,取而代之的是试用版.没有任何警告。并且没有选择避免“升级”。没错:我没有去公司的网站并从他们那里下载任何东西。但是旧的 ReSharper 中有许可逻辑被重定向到他们,并允许他们停用我拥有的副本。我发誓永远不会在任何情况下从 redgate 购买任何东西,或以其他方式鼓励他们的存在。
        【解决方案19】:

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

        【讨论】:

        猜你喜欢
        • 2015-04-21
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2015-02-05
        • 2011-08-03
        相关资源
        最近更新 更多