Visual Studio:基本クラスから継承されたすべてのクラスを表示するにはどうすればよいですか?


139

Visual Studioで、基本クラスから継承されたすべてのクラスを表示するにはどうすればよいですか?

たとえば、ASP.NET MVCにはいくつかの「ActionResult」タイプがあり、それらはすべて基本クラスを継承/実装していActionResultます。

あなただけの「知っている」ことをしない限り、同じように見えますViewし、Json有効なActionResultタイプ、あなたは簡単にこの情報を見つけることができます方法はありません。

私が間違っていることを証明してください。

オブジェクトブラウザにこれを簡単に見つけられるものはありますか?

さまざまなクラスに関するこの情報を発見するために、Visual Studioの外部にあるツールの提案も用意しています。たとえば、Resharperに私を助ける何かがありますか?


2
Visual C#2010 Expressを使用して、ソリューションで「:ActionResult」を検索します。理想的ではありませんが、何もないよりはましです。
ヨーヨー

2
私の質問を誤解していると思います。JsonResult(ここで参照:msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx)はActionResultから継承します。ActionResultから継承する他のクラスがいくつかあります。ActionResultから継承するすべてのクラスを確認する簡単な方法は何ですか?
Dan Esparza

3
この場合、私が使用しているコードは、ソリューションに直接表示されるコードではありません。これらは、別のアセンブリのMVCフレームワーククラスです。「:ActionResult」の検索は、アセンブリから使用するコードでは機能しません。
Dan Esparza

回答:


50

確かに、Resharperはこれを行うことができます。そして、はるかに。

任意の場所でタイプ名を右クリックし、コンテキストメニューで[継承先に移動]を選択します。「Go To Inheritor」は、オーバーライドおよびインターフェースメソッドの実装に移動するためのメソッドにも適用できます。インターフェースの場合は、「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
Visual Studio 6は、約20年前にC ++プロジェクトでそれを使用していました。オブジェクトブラウザとクラスダイアグラムは、継承ツリーをフリップする同じ軽量機能を提供しません。私は最近、少なくともJavaを備えたEclipseにこれの優れたバージョンがあることを発見しました。MSに来て、元の開発者の1人に電話して、何を失ったのかを尋ねてください。すべてのプロジェクトでコンパイル後にBSCブラウズデータを生成する必要があることを認めましたが、それで問題ありませんでした。本当にそうだった。
Philip Beck

150

VS2012の場合、

  1. ソリューションエクスプローラーでファイルに移動する
  2. クラスを展開して選択します
  3. クラスアイテム(ファイルアイテムではない)を右クリックして、[派生型]を選択します。

9
これはあなたが書いたソースコードを想定しています。これは元の質問で述べられた例とどのように連携しますか?(ActionResultのタイプ)
Dan Esparza 2013

ActionResultから派生するタイプがある場合は、そのタイプを右クリックして[ベースタイプ]を選択できます。これにより、ActionResultに移動します。これを右クリックして、[派生タイプ]を選択できます。(ActionResultから派生する型がない場合は、System.Objectに戻り、次にActionResultに戻ることができます。)
yoyo

21
私のように、クラスのコードファイルを右クリックして、「派生型」メニューオプションがない理由に困惑している人のために、まずコードファイルアイテムを展開してクラスアイテムを表示する必要があることを思い出してください。右クリック。
BCA 2014

3
私はVS 2017を使用しています。残念ながら、これは同じアセンブリ内に存在するクラスのみを示しており、ソリューション全体を示しているわけではありません。
NightOwl888 2017年

4
この機能がソリューションエクスプローラーに存在するが、クラスビューには存在しないのは奇妙です。
2017

73

これには必ずしもReflectorは必要ありません。VisualStudioの「クラス図」ビューを使用すると、特定のクラスのすべての派生クラスも簡単に見つけることができます。「クラスビュー」でクラスを右クリックし、「クラス図の表示」を選択します。階層に必要な詳細レベルが図に表示されない場合は、図のクラスのボックスを右クリックして、[派生クラスの表示]を選択します。

Resharperほど直接的ではないかもしれませんが、R#がまだない場合はオプションです。

残念ながら、Visual Studioの特定のバージョンにそれがあるかどうかはわかりません。


15
これにより、ターゲットクラス/インターフェイスを継承/実装するソリューション内のクラスのみを表示できます。知っておいてよかった。
Markus Jarderot、

この方法の制限について知っていますか?すべてのサブクラスを表示することができないためです(追加のインターフェースを実装していないサブクラスのみが表示されているようです)。
セルジュ2013年

1
「現在のプロジェクトにはXXXから派生するタイプはありません」というエラーが表示されたので、解決策ではなく、現在のプロジェクトのタイプに限定されていると思います
Andy

「派生クラスの表示」を再帰的に実行できますか?または、すべてのサブクラスで「派生クラスを表示」を明示的に選択する必要がありますか?
James Wierzba

15

これは最も怠惰な答えです(私はこの答えを誇りに思っています:)

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

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 2017年

3
@DanEsparza:少なくともVS2017ではそうです。だから私は答えをupvoted
ジョアン・アントゥネスに

1
いいね。残念ながら、階層ツリーは表示されません...私は同じツリーレベルですべてをリストします。
ロンバス

そして、名前はいつも偽であるので、私の検索/使用中に完全に見落とされていたので、それを見つけるために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

Resharperがインストールされていると仮定します。クラス/インターフェイスにカーソルを合わせて右クリックします-検査-階層

これは、サブクラス、実装、およびスーパークラスを示しています。


うーん...興味深いですが、私が探していたものではありません。返されたActionResultアイテムを右クリックして次の手順を実行すると、「コントローラー」(含まれているクラスのタイプ)の「検査」オプションが表示されます。「ViewResult」の定義に移動しようとすると、メタデータが表示され、階層を検査するオプションがありません。
Dan Esparza

1
また、これはResharperが提供する機能であると私はかなり確信しています。これは、Visual Studioにネイティブではありません...
Dan Esparza '19

7

Visual Studioクラスビューを試す

Visual Studioクラスビューで、目的のクラスに移動し、そのベースクラスと派生クラスを見つけます。


3
これは実際に役立つ可能性のあるビューです。悲しいことに、それは信じられないほど遅く、現在のエディターをリンク/フォローせず、一般的にはVSで後付けのように感じます。
E-Riz 2017年

これにより、ソリューション内のクラスだけでなく、すべてのクラスが表示され、すぐに使用できます。遅くはありません。よりグラフのようなビューには、クラス図の組み込み機能も使用します(ただし、ソリューション内のクラスのみを表示します)。これが私が必要とするすべてのことであり、これが最良の答えです。
ニコス

5

リフレクターを使用することもできます。

調べたいすべてのアセンブリを読み込み、型に移動して、派生型アイテムを展開します。

これはオブジェクトブラウザーでも実行できますが、何らかの理由でVS2008は.Net Frameworkビューの1つでしか実行できません。(VS2010 Beta 2はどのビューでも実行できます)


3
リフレクターは現在お金がかかりますが、ILSpyは同じことを無料で行います。
ヨーヨー

30日間の無料試用版がありますが、無期限に使用できる無料版はありません。あなたが私が知らないことを知らない限り?私はreflector.netをチェックしただけです。
ヨーヨー

1
ごめんなさい; リフレクターはまだ無料版を持っています。彼らはいつそれを取り除きましたか?
SLaks、


3
本当に恐ろしいのは、その日以降に、以前にダウンロードした無料バージョンのコピーを実行した場合、redgate(彼らはReflectorを購入した)が古い無料バージョンを削除して、試用版に置き換えたことです。警告なし。「アップグレード」を回避するオプションはありません。そうです。私は会社のWebサイトにアクセスして、そこから何もダウンロードしていませんでした。しかし、古いReSharperにはライセンスロジックがあり、リダイレクトされて、私が持っていたコピーを非アクティブ化することができました。私は決して、いかなる状況においても、レッドゲートから何かを購入したり、その他の方法でそれらの存在を奨励したりしないことを誓った。
ToolmakerSteve、2014年


4

ReSharper(バージョン2016.1.2)の助けを借りて、基本クラスでCtrl+ Alt+ +を実行Clickします。次のようなものが表示されます。

派生クラスreSharperを参照してください


1
いいね!したがって、リストで太字で表示されているクラス名は、選択した基本クラスから直接継承しているようで、太字でないリストのクラス名は、選択した基本クラスから間接的に継承しているようです。
Simon Bosley

丁度。Baldは直接継承するクラスになります。
DEVID


1

タイプを選択して右クリックして何かを参照---コードマップに表示--option selectこれは、このタイプを.dgmlファイル形式と同じように非常に優れた画像として継承する人のために、画像の形式を生成します。


1

Visual Assistを使用している人のためのオプションとして、Shift + Alt + Gキーを押して(キャレットがクラス名にあるときに)、「Goto関連」コンテキストメニューを表示できます。派生クラスがある場合は、サブメニューが表示されますそのため、それらすべてを一覧表示し、それらの派生クラス間の継承構造も示します。


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

または、t.IsSubClassOf(targetclass)を使用することもできます。
user420667 2012

0

VS2012にアップグレードした場合は、「コードマップ」を使用できます。
継承階層を表示するタイプを右クリックし、[コードマップに追加]を選択します。次に、コードマップビューでノードを展開し、右クリックして[派生クラス/基本クラスを表示]を選択します。残念ながら、.NETが提供するクラスでは機能しません。


4
参考までに、これはUpdate 1がインストールされているVS2012 Ultimateにのみ適用されます。残念ながら、プレミアム/プロの人々はこれらのマップを作成できません。
Sean Hanley

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のEnterpriseエディションでのみ利用できます。お持ちでない場合ここからEnterprise Previewバージョンをダウンロードして無料で入手できます
  • または、チームの誰もがその機能を持っている場合、この機能を使用してコードマップを共有するように依頼するだけかもしれません。

PS 他のエディションには含まれていない非常に便利なツールがたくさんあるので、エンタープライズバージョン(または少なくともプレビューバージョン)をマシンに保存することは本当に価値があります。


1
これはあなたがソースを持っているタイプに対してのみ機能するようです。のようなものではありませんActionResult(OPの例)
Iain

-1

これを行う非常に簡単な方法: Classnameは、「検索と置換ウィンドウ」(CTRL + F)で検索し、「検索オプション/単語全体を一致」オプションを使用することです。継承されたクラスのみが見つかります。


1
これは毎回機能するわけではありません。考慮してくださいclass DDerived : IInterface, BBase
jirkamat 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.