当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《VisualStudio:如何显示从基类继承的所有类?》经验,为你挑选了9个好方法。

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

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

看起来除非你只是"知道" View并且Json是有效的ActionResult类型,否则你无法轻易找到这些信息.

请证明我错了.

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

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



1> countunique..:

对于VS2012,

    导航到解决方案资源管理器中的文件

    展开并选择您的课程

    右键单击类项(不是文件项) - >派生类型


对于那些和我一样,右键单击类的代码文件并且难以理解为什么没有"派生类型"菜单选项的人:回想一下你必须首先展开代码文件项以显示类项 - 然后右键点击.
这假定您编写的源代码.如何使用原始问题中陈述的示例?(ActionResult类型)
这个功能在解决方案资源管理器中是如何存在的,但不是类视图.
我正在使用VS2017。不幸的是,这仅显示了同一程序集中存在的类,而没有显示整个解决方案。

2> Michael Burr..:

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

可能不如Resharper那么直接,但如果你没有R#,那么这是一个选择.

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


这只会让您查看解决方案中继承/实现目标类/接口的类.很高兴知道.
在Visual Studio的Express版本中不可用:(

3> Shrike..:

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

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

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


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


我不敢相信MS还没有把这种功能放到VS中......
真是太遗憾了.使用免费Eclipse的Java开发人员可以开箱即用.在我的Resharper + VS2015中,我看到"go to Implementation"而不是"Go To Inheritor".
Visual Studio 6在近20年前就已将其用于C ++项目。对象浏览器和类图没有提供相同的轻量级功能来翻转继承树。我最近发现Eclipse在Java方面有一个很好的版本。来吧,MS,给您的一位前开发人员打电话,问您丢失了什么。...准予批准,这要求所有项目在编译选项后都具有生成BSC浏览数据的功能,但这很好。真的是。

4> Mzn..:

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

我没有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 typeTreeDictionary = new Dictionary();
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代表一个很酷的代码示例.其他程序集中的基类和派生类怎么样?

5> Ahmad..:

从"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中.所以我赞成了答案

6> Dan Esparza..:

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

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

Jetbrains是制造Resharper的公司.

查找派生类的步骤:

    启动dotPeek

    选择"从GAC打开..."并添加System.Web.MVC程序集

    选择"导航/转到键入"并输入 ActionResult

    ActionResult类声明中,右键单击并选择"派生符号"

    瞧!显示每个派生类(即使是一些我不知道的!)



7> 小智..:

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

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



8> sigirisetti..:

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


这实际上是一个潜在有用的视图。可悲的是,它非常慢,没有链接/跟随当前的编辑器,并且通常感觉像是VS中的事后想法。

9> SLaks..:

您也可以使用Reflector.

加载要查看的所有程序集,导航到类型,然后展开"派生类型"项.

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


反射器现在需要花钱,但ILSpy将免费提供相同的服务.
真正可怕的是,在那个日期之后,如果您运行了之前下载的免费版本的副本,redgate(他们购买了Reflector)删除旧的免费版本,将其替换为试用版.没有任何警告.并没有选择避免"升级".这是对的:我没有去公司的网站并从他们那里下载任何东西.但旧的ReSharper中有许可逻辑被重定向到它们,并允许它们停用我的副本.我发誓永远不会在任何情况下从redgate购买任何东西,或以其他方式鼓励他们存在.
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有