Visual Studio: Bagaimana cara memperlihatkan semua kelas yang diwarisi dari kelas dasar?


139

Di Visual Studio, Bagaimana cara memperlihatkan semua kelas yang diwarisi dari kelas dasar?

Misalnya , dalam ASP.NET MVC ada beberapa jenis ' ActionResult ' - dan mereka semua mewarisi dari / mengimplementasikan kelas dasar ActionResult.

Sepertinya kecuali Anda hanya 'tahu' itu Viewdan Jsonadalah ActionResulttipe yang valid , tidak ada cara Anda dapat dengan mudah menemukan informasi ini.

Tolong buktikan saya salah.

Apakah ada sesuatu di browser objek yang membuatnya mudah ditemukan?

Saya bahkan menerima saran alat di luar Visual Studio untuk menemukan informasi ini tentang berbagai kelas. Misalnya: apakah ada sesuatu di Resharper yang akan membantu saya?


2
Dengan Visual C # 2010 Express saya mencari solusi untuk ": ActionResult". Tidak ideal, tetapi lebih baik daripada tidak sama sekali.
yoyo

2
Saya pikir Anda salah mengerti pertanyaan saya. JsonResult (referensi di sini: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) mewarisi dari ActionResult. Ada beberapa kelas lain yang mewarisi dari ActionResult. Apa cara mudah untuk melihat semua kelas yang diwarisi dari ActionResult?
Dan Esparza

3
Dalam hal ini, kode yang saya gunakan bukan kode yang muncul langsung di solusi saya. Mereka adalah kelas kerangka kerja MVC di majelis lain. Mencari ": ActionResult" tidak akan berfungsi untuk kode apa pun yang saya gunakan dari majelis.
Dan Esparza

Jawaban:


50

Tentu, Resharper dapat melakukan ini. Dan banyak lagi.

Cukup klik kanan pada ketik nama di sembarang tempat dan pilih "Go To Inheritor" di menu konteks. "Go To Inheritor" juga dapat diterapkan pada metode untuk menavigasi ke penggantian dan implementasi metode antarmuka. Untuk antarmuka Anda bisa memanggil "Temukan Penggunaan Lanjutan" lagi, cukup klik kanan) di mana menemukan semua perluasan dan implementasi. Untuk tipe - tipe turunan. Dan fitur favorit saya - klik dengan menahan Kontrol pada semua jenis / metode untuk menavigasi ke deklarasi.

Saya pikir ini adalah alat yang harus dimiliki untuk pengembang .net.


Di Resharper 9.2, pada jenis apa pun dalam kode sumber, klik kanan "Temukan Penggunaan Tingkat Lanjut", pilih Temukan = "Berasal" dan Cakupan = "Solusi dan Perpustakaan".
Misalnya, untuk menemukan semua pewaris (baik di perpustakaan dan kode Anda) dari beberapa kelas dasar dalam DLL yang disertakan dari vendor mana pun, deklarasikan variabel dalam kode Anda dengan kelas dasar itu. Kemudian klik kanan pada nama kelas dasar yang baru saja Anda ketik.


6
Memalukan. Pengembang Java yang menggunakan Eclipse gratis, memiliki fungsi ini di luar kotak. Di Resharper + VS2015 saya, saya melihat "pergi ke Implementasi" daripada "Go To Inheritor".
Kutub Utara

1
Tapi ini tidak memberiku kelas di tengah, hanya pergi. CTRL + ALT + B akan memberikan jawabannya.
Kutub Utara

2
Visual Studio 6 memilikinya pada proyek-proyek C ++ hampir 20 tahun yang lalu. Browser objek dan diagram kelas tidak memberikan kemampuan ringan yang sama untuk membalik pohon warisan. Saya baru-baru ini menemukan bahwa Eclipse memiliki versi hebat ini, dengan Java setidaknya. Ayo MS, telepon salah satu mantan pengembang Anda dan tanyakan apa yang Anda miliki tetapi hilang .... Memang itu mengharuskan semua proyek untuk memiliki data penelusuran BSC setelah opsi kompilasi, tapi itu tidak masalah. Benar-benar begitu.
Philip Beck

150

Untuk VS2012,

  1. Arahkan ke file di explorer solusi
  2. Rentangkan dan pilih kelas Anda
  3. Klik kanan item kelas (bukan item file) -> Jenis Turunan

9
Ini mengasumsikan kode sumber yang Anda tulis. Bagaimana ini akan bekerja dengan contoh yang dinyatakan dalam pertanyaan asli? (Jenis ActionResult)
Dan Esparza

Jika Anda memiliki jenis apa pun yang berasal dari ActionResult maka Anda dapat mengklik kanan pada jenis Anda dan memilih Jenis Basis, yang akan membawa Anda ke ActionResult, yang sekarang Anda bisa klik kanan dan pilih Jenis yang Diperoleh. (Jika Anda tidak memiliki tipe yang berasal dari ActionResult maka Anda dapat bekerja kembali ke System.Object dan kemudian turun ke ActionResult.)
yoyo

21
Bagi Anda yang, seperti saya, klik kanan pada file kode kelas dan bingung mengapa tidak ada opsi menu "turunan": ingat bahwa Anda harus terlebih dahulu memperluas item file kode untuk mengungkapkan item kelas - lalu klik kanan.
BCA

3
Saya menggunakan VS 2017. Sayangnya, ini hanya menunjukkan kelas-kelas yang ada di majelis yang sama, tidak menunjukkan seluruh solusi.
NightOwl888

4
Sungguh aneh bagaimana fungsi ini ada di Solution Explorer tetapi tidak dalam Tampilan Kelas.
Dai

73

Anda tidak perlu Reflektor untuk ini - tampilan "Class Diagram" Visual Studio akan memungkinkan Anda dengan mudah menemukan semua kelas turunan untuk kelas tertentu juga. Klik kanan pada kelas di "Tampilan Kelas" dan pilih "Lihat Diagram Kelas". Jika diagram tidak menunjukkan tingkat detail yang Anda inginkan untuk hierarki, klik kanan pada kotak untuk kelas dalam diagram, dan pilih "Tampilkan Kelas yang Diperoleh".

Mungkin tidak searah Resharper, tetapi ini merupakan opsi jika Anda belum memiliki R #.

Sayangnya, saya tidak yakin versi tertentu dari Visual Studio yang memilikinya.


15
Ini hanya akan membiarkan Anda melihat kelas-kelas dalam solusi Anda yang mewarisi / mengimplementasikan kelas target / antarmuka. Senang tahu.
Markus Jarderot

Apakah Anda tahu keterbatasan metode ini? Karena itu tidak memungkinkan saya untuk melihat semua subclass (sepertinya itu hanya menunjukkan subclass yang tidak mengimplementasikan antarmuka tambahan).
Serge

1
Saya mendapat kesalahan dengan mengatakan "Tidak ada jenis yang berasal dari XXX dalam proyek saat ini", jadi saya pikir itu terbatas pada jenis dalam proyek saat ini, bukan solusinya
Andy

Bisakah saya melakukan "Tampilkan kelas turunan" secara rekursif? Atau apakah saya harus memilih "Tampilkan kelas turunan" pada setiap sub kelas secara eksplisit?
James Wierzba

15

Ini adalah jawaban yang paling tidak malas (saya hanya bangga dengan jawaban ini :)

Saya tidak punya ReSharper, sudah pernah mencobanya tetapi tidak mau membelinya. Saya mencoba diagram kelas tetapi tidak praktis sama sekali karena diagram hierarki menjangkau dunia 3 kali lipat dan layar laptop saya tidak memiliki lebar yang tak terbatas. Jadi solusi alami dan mudah saya adalah menulis beberapa kode Windows Forms untuk beralih pada tipe-tipe dalam perakitan dan menggunakan refleksi untuk menambahkan node ke tampilan struktur pohon, sebagai berikut:

anggap Anda memiliki kotak teks, tampilan hierarki dan hal-hal lain yang diperlukan pada formulir di mana kode ini berjalan

//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 untuk contoh kode keren. Bagaimana dengan kelas dasar & kelas turunan di majelis lain?
ToolmakerSteve

@ToolmakerSteve, bagaimana AppDomain.CurrentDomain.GetAssemblies()? Lihatlah ini: stackoverflow.com/questions/851248/…
Mzn

14

Mulai dari 'Visual Studio 2015 Pembaruan 1' Anda cukup klik kanan pada nama kelas di editor kode kelas dan kemudian pilih 'Go To Implementation "dari menu konteks: dengan Ctrl + F12 sebagai pintasan.

Lihat https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ untuk rincian lebih lanjut.


1
Saya menghargai tipnya, tetapi saya tidak yakin ini membahas kasus penggunaan asli saya melihat semua kelas yang diwarisi dari kelas dasar.
Dan Esparza

3
@ DanEsparza: ya, setidaknya di VS2017. Jadi saya membatalkan jawaban
João Antunes

1
Itu bagus. Sayangnya, tidak menampilkan hierarki pohon ... Saya hanya mendaftar semua di level pohon yang sama.
Lombas

Dan seperti biasa nama itu palsu, benar-benar diabaikan selama pencarian / penggunaan saya, harus datang ke StackOverflow untuk menemukannya!
dim8

10

Belum ada yang menyebutkan ini, jadi saya akan menambahkannya.
Jetbrains dotPeek adalah decompiler .NET gratis yang memiliki kekuatan untuk menampilkan informasi ini dengan mudah.

Unduh gratis: http://www.jetbrains.com/decompiler/

Jetbrains adalah perusahaan yang membuat Resharper.

Langkah-langkah untuk menemukan kelas turunan:

  1. Mulai dotPeek
  2. Pilih 'Buka dari GAC ...' dan tambahkan unit System.Web.MVC
  3. Pilih 'Navigasi / Pergi ke ketik' dan ketik ActionResult
  4. Pada ActionResultdeklarasi kelas, klik kanan dan pilih 'Simbol yang diturunkan'
  5. Voila! Setiap kelas turunan ditunjukkan (bahkan beberapa yang saya tidak tahu!)

7

Dengan asumsi Anda telah menginstal ulang Resharper : dengan kursor di kelas / antarmuka, klik kanan - Inspect - Hierarchies

Ini menunjukkan subclass, implementasi, dan superclasses.


Hmmm ... menarik, tapi bukan yang saya cari. Jika saya klik kanan pada item ActionResult yang dikembalikan dan ikuti langkah-langkah ini, saya mendapatkan opsi 'Periksa' untuk 'Kontroler' (jenis kelas yang mengandung). Jika saya mencoba membuka definisi 'ViewResult', saya menggunakan metadata dan saya tidak memiliki opsi untuk Memeriksa Hirarki.
Dan Esparza

1
Juga: Saya cukup yakin ini adalah fungsi yang disediakan oleh Resharper, itu bukan asli di Visual Studio ...
Dan Esparza

7

Coba Visual Studio Class View

Di Visual Studio Class View navigasikan ke kelas yang Anda minati dan temukan basisnya dan kelas turunannya


3
Ini sebenarnya adalah pandangan yang berpotensi berguna. Sayangnya, ini sangat lambat, tidak menautkan / mengikuti editor saat ini, dan umumnya terasa seperti renungan di VS.
E-Riz

Ini menunjukkan semua kelas, bukan hanya yang ada di solusi Anda dan berfungsi langsung di luar kotak. Itu tidak lambat. Untuk tampilan yang lebih mirip grafik, gunakan fitur bawaan Class Diagram juga (tetapi itu hanya menampilkan kelas dalam solusi Anda). Ini semua yang saya butuhkan dan ini adalah jawaban terbaik.
Nikos

5

Anda juga dapat menggunakan Reflektor .

Muat semua rakitan yang Anda inginkan terlihat, navigasikan ke suatu jenis, dan perluas item Jenis yang Diperoleh.

Anda juga dapat melakukan ini di Browser Obyek, tetapi karena alasan tertentu VS2008 hanya dapat melakukannya di salah satu tampilan .Net Framework. (VS2010 Beta 2 dapat melakukannya dalam tampilan apa pun)


3
Reflektor sekarang membutuhkan biaya, tetapi ILSpy akan melakukan hal yang sama secara gratis.
yoyo

Ada uji coba gratis 30 hari, tetapi tidak ada versi gratis yang dapat Anda gunakan tanpa batas. Kecuali Anda tahu sesuatu yang saya tidak tahu? Saya baru saja memeriksa reflector.net .
yoyo

1
Maaf; Dulu reflektor masih memiliki edisi gratis. Kapan mereka menyingkirkannya?
SLaks

2 Februari 2011 - zdnet.com/blog/burnette/…
yoyo

3
Apa yang benar-benar mengerikan, adalah bahwa setelah tanggal itu, jika Anda menjalankan salinan versi gratis yang sebelumnya Anda unduh, redgate (mereka membeli Reflektor) MENGHAPUS versi gratis yang lama, menggantikannya dengan uji coba. Tanpa peringatan apa pun. Dan tidak ada pilihan untuk menghindari "peningkatan". Itu benar: Saya belum pergi ke situs web perusahaan dan mengunduh apa pun dari mereka. Tetapi ada logika lisensi di ReSharper lama yang dialihkan ke mereka, dan memungkinkan mereka untuk menonaktifkan salinan yang saya miliki. Saya bersumpah untuk tidak pernah, dalam keadaan apa pun, membeli sesuatu dari redgate, atau mendorong keberadaan mereka.
ToolmakerSteve


4

Dengan bantuan ReSharper (versi 2016.1.2), cukup Ctrl+ Alt+ Clickpada Kelas Dasar. Anda akan melihat sesuatu seperti ini:

lihat kelas turunan reSharper


1
+1 Bagus! Jadi sepertinya nama-nama kelas yang muncul dalam huruf tebal dalam daftar secara langsung mewarisi dari kelas dasar yang dipilih, dan nama-nama kelas dalam daftar yang tidak tebal secara tidak langsung mewarisi dari kelas dasar yang dipilih?
Simon Bosley

Persis. Botak akan menjadi kelas yang langsung mewarisi.
Devid


1

pilih jenis dan klik kanan melihat sesuatu --- tampilkan pada peta kode - pilih pilih itu menghasilkan formet gambar untuk mereka yang mewarisi jenis ini sebagai gambar yang sangat bagus seperti format file .dgml itu memberikan lebih banyak info tentang jenis


1

Sebagai pilihan bagi mereka yang menggunakan Visual Assist, Anda juga dapat menekan Shift + ALT + G (sementara tanda sisipan ada pada nama kelas) untuk memunculkan menu konteks "Terkait Goto", dan jika ada kelas turunan Anda akan mendapatkan submenu untuk itu daftar mereka semua dan bahkan menunjukkan struktur warisan di antara kelas-kelas turunan.


0

Cukup kode itu.

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
Sayangnya ini hanya memberi tahu Anda jenis yang secara langsung mewarisi dari kelas tertentu, bukan yang secara tidak langsung mewarisi dari kelas. Untuk itu Anda mungkin harus menggunakan sesuatu seperti apa yang ditulis MZN.
user420667

Atau Anda bisa menggunakan t.IsSubClassOf (targetclass).
user420667

0

jika Anda meningkatkan ke VS2012 Anda dapat menggunakan "Peta Kode".
Klik kanan pada jenis yang Anda ingin melihat hierarki warisan dan pilih "Tambahkan ke kode peta". Kemudian dalam tampilan peta kode Anda dapat memperluas node dan klik kanan untuk memilih "Tampilkan kelas yang diturunkan / Basis". Sayangnya tidak berfungsi untuk .NET kelas yang disediakan.


4
FYI kepada orang lain, ini hanya berlaku untuk VS2012 Ultimate dengan Pembaruan 1 diinstal. Orang-orang Premium / Pro tidak dapat membuat peta ini, sayangnya.
Sean Hanley

0

Untuk Visual Studio 2012 ( Tanpa ReSharper )

  1. Di Solution Explorer klik kanan pada kelas (yang kelas turunannya ingin Anda lihat).
  2. Di diagram kelas, klik kanan pada kelas dan pilih 'Tampilkan kelas turunan'.

1
Sekali lagi, sejauh yang saya tahu ini hanya akan menunjukkan kelas turunan yang Anda tulis. Bagaimana ini akan bekerja dengan contoh yang dinyatakan dalam pertanyaan asli? (Jenis ActionResult)
Dan Esparza

0

Pembaruan 2020:

Anda dapat menggunakan Peta Kode Visual Studio yang berfungsi cukup baik.

Cukup klik kanan pada kelas dan menavigasi ke:
Code Map> Show Related Items on Code Map>Show All Derived Types

masukkan deskripsi gambar di sini

catatan:

  • Fitur ini hanya tersedia di Visual Studio edisi Enterprise, dan jika Anda tidak memilikinya , Anda bisa mendapatkannya secara gratis dengan mengunduh versi Enterprise Preview dari sini .
  • Atau Anda mungkin bertanya kepada siapa saja dari tim Anda untuk membagikan peta kode dengan fitur ini jika mereka memiliki edisi itu.

PS Sebaiknya simpan versi Perusahaan (atau setidaknya versi Pratinjau) di mesin Anda, karena memiliki banyak alat yang sangat berguna yang tidak termasuk dalam edisi lain.


1
Tampaknya ini hanya berfungsi untuk tipe sumber yang Anda miliki. Bukan hal-hal seperti ActionResult(contoh OP)
Iain

-1

Cara yang sangat sederhana untuk melakukan ini, adalah mencari : Classnamedi "Temukan dan Ganti Jendela" (CTRL + F) dan gunakan Opsi "Temukan Opsi / Cocokkan seluruh kata". Anda hanya akan menemukan kelas-kelas yang diwarisi.


1
Ini tidak berfungsi setiap waktu, pertimbangkanclass DDerived : IInterface, BBase
jirkamat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.