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


139

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

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

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

请证明我错了。

对象浏览器中是否有某些东西可以很容易地找出来?

我什至会提出有关Visual Studio外部工具的建议,以发现有关各种类的信息。例如:Resharper中有什么可以帮助我的吗?


2
使用Visual C#2010 Express,我在解决方案中搜索“:ActionResult”。不理想,但总比没有好。
yoyo

2
我想你误解了我的问题。JsonResult(此处参考:msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx)继承自ActionResult。还有一些其他类继承自ActionResult。查看从ActionResult继承的所有类的简便方法是什么?
Dan Esparza 2012年

3
在这种情况下,我使用的代码不是直接显示在解决方案中的代码。它们是另一个程序集中的MVC框架类。搜索“:ActionResult”不适用于我在程序集中使用的任何代码。
Dan Esparza 2012年

Answers:


50

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

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

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


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


6
真可惜 使用免费Eclipse的Java开发人员可以立即使用此功能。在我的Resharper + VS2015中,我看到“转到实现”而不是“转到继承者”。
北极

1
但这并没有给我中间的课程,只有叶子。CTRL + ALT + B会给出答案。
北极

2
将近20年前,Visual Studio 6已将其用于C ++项目。对象浏览器和类图没有提供相同的轻量级功能来翻转继承树。我最近发现Eclipse在Java方面有一个很好的版本。来吧,MS,给您的一位前开发人员打电话,问是什么但您丢失了……。授予它要求所有项目都具有在编译选项后生成BSC浏览数据的功能,但这很好。真的是。
菲利普·贝克

150

对于VS2012,

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

9
这假设您编写了源代码。这将如何与原始问题中所述的示例一起使用?(ActionResult类型)
Dan Esparza

如果您有从ActionResult派生的任何类型,则可以右键单击您的类型并选择“基本类型”,这将带您进入ActionResult,现在您可以右键单击并选择“派生类型”。(如果您没有从ActionResult派生的类型,那么您可以按照自己的方式返回System.Object,然后再返回至ActionResult。)
2014年

21
对于像我一样右键单击该类的代码文件并为为什么没有“派生类型”菜单选项而感到困惑的人们:回想一下,您必须首先扩展代码文件项以显示该类项-然后右键点击。
BCA 2014年

3
我正在使用VS2017。不幸的是,这仅显示了同一程序集中存在的类,而没有显示整个解决方案。
NightOwl888

4
解决方案资源管理器(而不是类视图)中存在此功能的方式很奇怪。

73

您不必为此使用Reflector-Visual Studio的“类图”视图将使您也可以轻松地找到特定类的所有派生类。在“类视图”中的类上单击鼠标右键,然后选择“查看类图”。如果该图未显示所需的层次结构详细信息级别,请右键单击该图中的类的框,然后选择“显示派生类”。

可能不像Resharper那样直接,但是如果您还没有R#,则可以选择。

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


15
这只会让您查看解决方案中继承/实现目标类/接口的类。很高兴知道。
马库斯·贾德罗

您知道这种方法的局限性吗?因为它不允许我查看所有子类(似乎它只显示未实现任何其他接口的子类)。
Serge

1
我收到一个错误消息:“当前项目中没有从XXX派生的类型”,所以我认为它仅限于当前项目中的类型,而不是解决方案
Andy

我可以递归执行“显示派生类”吗?还是我必须在每个子类上明确选择“显示派生类”?
詹姆斯·维尔茨巴

15

这是最不懒惰的答案(我为这个答案感到骄傲:)

我没有ReSharper,之前也试过,但不想购买。我尝试了一个类图,但根本不实用,因为层次图跨越了世界3倍,而且笔记本电脑的屏幕没有无限宽度。因此,我自然而又轻松的解决方案是编写一些Windows Forms代码以遍历程序集中的类型,并使用反射将节点添加到树形视图中,如下所示:

请假设您在运行此代码的表单上有一个文本框,树视图和其他所需的东西

//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();

2
+1是一个很酷的代码示例。那么其他程序集中的基类和派生类呢?
ToolmakerSteve 2014年

@ToolmakerSteve,怎么样AppDomain.CurrentDomain.GetAssemblies()?看看这个:stackoverflow.com/questions/851248/...
MZN

14

从“ Visual Studio 2015 Update 1”开始,您可以简单地在类代码编辑器中右键单击类名称,然后从上下文菜单中选择“转到实现”:Ctrl + F12是快捷方式。

有关更多详细信息,请参阅https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/


1
我很欣赏这个技巧,但是我不确定这是否能解决我最初看到的从基类继承的所有用例。
Dan Esparza

3
@DanEsparza:确实如此,至少在VS2017中如此。所以,我upvoted答案
若昂·安图内斯

1
这真好。不幸的是,没有显示层次结构树。我只列出了同一棵树中的所有树。
隆巴斯'19

和往常一样,这个名字是假的,在我的搜索/使用过程中完全忽略了它,不得不来到StackOverflow来查找它!
dim8

10

现在还没有人提及,因此我将其添加。
Jetbrains dotPeek是一个免费的.NET反编译器,具有轻松显示此信息的功能。

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

Jetbrains是生产Resharper的公司。

查找派生类的步骤:

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

7

假设您有剃须刀安装:在类/接口上使用光标,右键单击-检查-层次结构

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


嗯...很有趣,但不是我想要的。如果我右键单击返回的ActionResult项并执行以下步骤,则将获得“控制器”(包含类的类型)的“检查”选项。如果尝试转到“ ViewResult”定义,那么我在元数据中,并且无法选择“检查层次结构”。
丹·埃斯帕萨

1
另外:我相当确定这是Resharper提供的功能,它不是Visual Studio本身提供的...
Dan Esparza 2012年

7

尝试使用Visual Studio类视图

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


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

这将显示所有类,而不仅仅是解决方案中的类,并且可以直接使用。不慢 对于更像图形的视图,也可以使用“类图”内置功能(但这仅显示解决方案中的类)。这就是我所需要的,这是最好的答案。
Nikos

5

您也可以使用Reflector

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

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


3
Reflector现在要花钱,但是ILSpy将免费这样做。
yoyo

有30天的免费试用期,但是没有免费版本可以无限期使用。除非你知道我不知道的事?我只是检查了reflector.net
yoyo 2012年

1
抱歉; Reflector过去仍然有免费版本。他们什么时候摆脱的?
SLaks'5

2011年2月2日- zdnet.com/blog/burnette/...
YOYO

3
真正令人恐惧的是,在那之后,如果您运行了先前下载的免费版本的副本,则redgate(他们购买了Reflector)删除了旧的免费版本,将其替换为试用版。没有任何警告。而且没有选择可以避免“升级”。没错:我还没有去公司的网站下载任何东西。但是在旧的ReSharper中有许可逻辑被重定向到他们,并允许他们停用我的副本。我发誓永远不会在任何情况下从redgate购买任何东西,或以其他方式鼓励它们的存在。
制造商史蒂夫(Steve),2014年


4

ReSharper(2016.1.2版)的帮助下,基本类仅需Ctrl+ Alt+ Click。您将看到如下内容:

查看派生类reSharper


1
+1好!这样看来,列表中以粗体显示的类名称是直接从所选基类继承的,列表中不是粗体的类名称是间接从所选基类继承的吗?
西蒙·博斯利

究竟。秃头将是直接继承的类。
戴维


1

选择类型,然后右键单击以查看某些内容---在代码映射上显示--option选择它为继承此类型的用户生成图像格式,该图像的格式非常好,如.dgml文件格式,它提供了有关类型的更多信息


1

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


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

2
不幸的是,这仅告诉您直接从特定类继承的类型,而不是间接从类继承的类型。为此,您可能必须使用MZN编写的内容。
user420667'8

或者,您可以使用t.IsSubClassOf(targetclass)。
user420667

0

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


4
仅供参考,这仅适用于安装了Update 1的VS2012 Ultimate。不幸的是,高级/专业人士无法创建这些地图。
肖恩·汉利2013年

0

对于Visual Studio 2012(不带ReSharper

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

1
再说一次,据我所知,这只会显示您编写的派生类。原始问题中所述的示例将如何工作?(ActionResult类型)
Dan Esparza

0

2020更新:

您可以使用Visual Studio的代码映射效果很好的。

只需右键单击类,然后导航至:
Code Map> Show Related Items on Code Map>Show All Derived Types

在此处输入图片说明

注意:

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

PS值得将企业版(或至少其预览版)保留在您的计算机中,因为它具有许多其他版本未包含的非常有用的工具


1
看来这仅适用于您有来源的类型。不是这样的东西ActionResult(OP的例子)
Iain

-1

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


1
考虑class DDerived : IInterface, BBase
一下
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.