Visual Studio: Bir temel sınıftan miras alınan tüm sınıfları nasıl gösterebilirim?


139

Visual Studio'da, bir temel sınıftan miras alınan tüm sınıfları nasıl gösterebilirim?

Örneğin , ASP.NET MVC'de birkaç ' ActionResult ' türü vardır ve bunların tümü temel sınıftan miras alır / uygular ActionResult.

Sadece 'bilmiyorsanız' Viewve Jsongeçerli ActionResulttürler olmadığı sürece , bu bilgiyi kolayca bulabilmenin bir yolu yoktur.

Lütfen bana yanlış olduğunu kanıtla.

Nesne tarayıcısında bunu bulmayı kolaylaştıran bir şey var mı?

Hatta çeşitli sınıflar hakkında bu bilgileri keşfetmek için Visual Studio dışında araç önerileri için hazırım. Örneğin: Resharper'da bana yardımcı olacak bir şey var mı?


2
Visual C # 2010 Express ile çözüm ": ActionResult" için arama. İdeal değil, ama hiç yoktan iyidir.
yoyo

2
Sanırım sorumu yanlış anlıyorsun. JsonResult (buraya bakın : msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) ActionResult öğesinden devralır. ActionResult öğesinden devralınan başka sınıflar da vardır. ActionResult'dan devralınan tüm sınıfları görmenin kolay yolu nedir?
Dan Esparza

3
Bu durumda, kullandığım kod doğrudan çözümümde görünen kod değil. Bunlar başka bir derlemede MVC çerçeve sınıflarıdır. ": ActionResult" araması, bir derlemeden kullandığım kodlar için çalışmaz.
Dan Esparza

Yanıtlar:


50

Elbette, Resharper bunu yapabilir. Ve daha fazlası.

Herhangi bir yerde yazım adını sağ tıklayın ve bağlam menüsünde "Mirasçıya Git" i seçin. "Devralmaya Git", geçersiz kılmalar için gezinme yöntemine ve bir arabirim yönteminin uygulamalarına da uygulanabilir. Bir arayüz için tüm uzantıları ve uygulamaları bulabileceğiniz "Gelişmiş Kullanımları Bul" seçeneğini tekrar arayabilirsiniz. Türden türetilen türler için. Ve benim en sevdiğim özellik - bildirimine gitmek için herhangi bir tür / yöntemde Control tuşunu basılı tutarak tıklayın.

Bence .net geliştiricileri için olmazsa olmaz bir araç.


Yeniden Oluşturucu 9.2'de, kaynak kodundaki herhangi bir türde, "Gelişmiş Kullanım Bul" seçeneğini rt-tıklatın, Find = "Türetilmiş" ve Kapsam = "Çözümler ve Kütüphaneler" i seçin.
Örneğin, herhangi bir satıcıdan gelen bir DLL'deki bazı temel sınıfın tüm devralmalarını (hem kitaplıkta hem de kodunuzda) bulmak için, kodunuzda bu temel sınıfla bir değişken bildirin. Ardından, yeni yazdığınız temel sınıf adına sağ tıklayın.


6
Utanç verici. Ücretsiz Eclipse kullanan Java geliştiricileri, bu işlevselliği kutudan çıkarır. Resharper + VS2015'imde, "Inheritor'a Git" yerine "Uygulamaya Git" i görüyorum.
Kuzey Kutbu

1
Ama bu bana ortadaki sınıfları vermiyor, sadece ayrılıyor. CTRL + ALT + B cevap verecektir.
Kuzey Kutbu

2
Visual Studio 6, yaklaşık 20 yıl önce C ++ projelerinde yer aldı. Nesne tarayıcısı ve sınıf diyagramı, miras ağaçlarını çevirmek için aynı hafifliği sağlamaz. Son zamanlarda Eclipse'ın en azından Java ile bunun harika bir sürümüne sahip olduğunu buldum. MS gel, eski geliştiriciler birini telefon ve ne vardı ama kaybetmek olduğunu sormak .... Tüm projelerin derleme seçeneği sonra BSC tarama verileri oluşturmak için gerekli verdi, ama bu iyi oldu. Gerçekten öyleydi.
Philip Beck

150

VS2012 için,

  1. Çözüm gezgininde dosyaya gidin
  2. Sınıfınızı genişletin ve seçin
  3. Sınıf öğesini sağ tıklayın (dosya öğesini değil) -> Türetilmiş Türler

9
Bu, yazdığınız kaynak kodunu varsayar. Bu, orijinal soruda belirtilen örnekle nasıl çalışır? (ActionResult türleri)
Dan Esparza

ActionResult öğesinden türetilen herhangi bir türünüz varsa, türünüzü sağ tıklatıp sizi şimdi sağ tıklayıp Türetilmiş Türler'i seçebileceğiniz ActionResult'a götürecek Temel Türler'i seçebilirsiniz. (ActionResult'tan türeyen bir türünüz yoksa, System.Object'e ve sonra ActionResult'a geri dönebilirsiniz.)
yoyo

21
Benim gibi, sınıfın kod dosyasını sağ tıklayan ve neden "türetilmiş türler" menü seçeneği bulunmadığına dair olanlar için: sınıf öğesini ortaya çıkarmak için önce kod dosyası öğesini genişletmeniz gerektiğini hatırlayın - sonra sağ tık.
BCA

3
VS 2017 kullanıyorum. Ne yazık ki, bu sadece aynı montajda var olan sınıfları gösterir, tüm çözümü göstermez.
NightOwl888

4
Bu işlevin Solution Explorer'da var olmasına rağmen Sınıf Görünümü'nde olmaması tuhaftır.
Dai

73

Bunun için Reflektör'e ihtiyacınız yoktur - Visual Studio'nun "Sınıf Diyagramı" görünümü, belirli bir sınıf için de türetilmiş tüm sınıfları kolayca bulmanızı sağlar. "Sınıf Görünümü" nde sınıfa sağ tıklayın ve "Sınıf Diyagramını Görüntüle" yi seçin. Diyagram, hiyerarşi için istediğiniz ayrıntı düzeyini göstermiyorsa, diyagramdaki sınıfın kutusunu sağ tıklayın ve "Türetilmiş Sınıfları Göster" i seçin.

Resharper kadar doğrudan olmayabilir, ancak zaten R # yoksa bir seçenektir.

Ne yazık ki, Visual Studio'nun hangi belirli sürümlerine sahip olduğundan emin değilim.


15
Bu, yalnızca çözümünüz içindeki hedef sınıfı / arabirimi devralan / uygulayan sınıfları görüntülemenize izin verir. Gerçi bilmek güzel.
Markus Jarderot

Bu yöntemin sınırlamaları hakkında bilginiz var mı? Çünkü tüm alt sınıfları görmeme izin vermiyor (sadece ek arayüz uygulamayan alt sınıfları gösteriyor gibi görünüyor).
Serge

1
"Mevcut projede XXX'den türetilen tür yok" hatası alıyorum, bu yüzden mevcut projedeki türlerle sınırlı olduğunu düşünüyorum, çözüm değil
Andy

"Türetilmiş sınıfları göster" i tekrar tekrar yapabilir miyim? Yoksa açıkça her alt sınıfta "Türetilmiş sınıfları göster" i seçmek zorunda mıyım?
James Wierzba

15

Bu en az tembel cevap (bu cevaptan gurur duyuyorum :)

ReSharper'ım yok, daha önce denedim ama satın almak istemedim. Bir sınıf diyagramı denedim ama pratik değil çünkü hiyerarşi diyagramı dünyayı 3 kez kaplıyor ve dizüstü bilgisayarımın ekranının sonsuz genişliği yok. Bu yüzden doğal ve kolay çözümüm, bir montajdaki türler üzerinde yineleme yapmak için bazı Windows Forms kodları yazmak ve ağaç görünümüne düğümler eklemek için yansıma kullanmaktı:

lütfen bu kodun çalıştığı bir formda bir metin kutusu, ağaç görünümü ve gerekli diğer şeyleri olduğunu varsayalım

//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
Bir soğuk kod örneği için +1. Diğer derlemelerde temel sınıflar ve türetilmiş sınıflar ne olacak?
ToolmakerSteve

@ToolmakerSteve, nasıl AppDomain.CurrentDomain.GetAssemblies()? Şuna bir göz atın: stackoverflow.com/questions/851248/…
Mzn

14

'Visual Studio 2015 Güncelleştirme 1'den başlayarak, sınıf kodu düzenleyicisindeki bir sınıf adına sağ tıklayıp ardından bağlam menüsünden' Uygulamaya Git 'seçeneğini seçebilirsiniz: Ctrl + F12 kısayol olarak.

Daha fazla bilgi için bkz. Https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ .


1
Bahşiş için teşekkür ederim, ancak bunun temel kullanımdan miras alınan tüm sınıfları görme konusundaki orijinal kullanım durumuma hitap ettiğinden emin değilim.
Dan Esparza

3
@DanEsparza: en azından VS2017'de. Bu yüzden cevabı iptal ettim
João Antunes

1
Bu iyi. Maalesef, hiyerarşi ağacını göstermiyor ... Hepsini aynı ağaç düzeyinde listeliyorum.
Lombas

Ve her zamanki gibi ad sahte, arama / kullanım sırasında tamamen gözden kaçan, bulmak için StackOverflow gelmek zorunda kaldı!
dim8

10

Henüz kimse bundan bahsetmedi, ben de ekleyeceğim.
Jetbrains dotPeek ücretsiz bir .NET decompiler bu bilgileri kolayca gösterme gücüne sahiptir.

Ücretsiz indirme: http://www.jetbrains.com/decompiler/

Jetbrains, Resharper'ı yapan şirkettir.

Türetilmiş sınıfları bulma adımları:

  1. DotPeek'i başlat
  2. 'GAC'dan aç ...' seçeneğini seçin ve System.Web.MVC montajını ekleyin
  3. 'Git / Türüne git'i seçin ve yazın ActionResult
  4. Açık ActionResultSınıf bildirimi, sağ tıklayıp 'Türetilmiş sembolleri' seçeneğini
  5. İşte bu kadar! Her türetilmiş sınıf gösterilir (bilmediğim birkaç tane bile!)

7

Resharper'ınız olduğunu varsayarsak yüklü : sınıf / arabirimde imleç ile sağ tıklatın - Denetle - Hiyerarşiler

Bu, alt sınıfları, uygulamaları ve üst sınıfları gösterir.


Hmmm ... ilginç, ama aradığım şey değil. Döndürülen bir ActionResult öğesine sağ tıklar ve bu adımları uygularsam, 'Denetleyici' (içeren sınıfın türü) için 'Denetle' seçeneklerini alıyorum. 'ViewResult' tanımına gitmeye çalışırsam, meta verilerdeyim ve Hiyerarşileri Denetleme seçeneğim yok.
Dan Esparza

1
Ayrıca: Bunun Resharper tarafından sağlanan bir işlev olduğundan oldukça eminim, yerel olarak Visual Studio'da değil ...
Dan Esparza

7

Visual Studio Sınıf Görünümü'nü deneyin

Visual Studio Sınıf Görünümü'nde ilgilendiğiniz sınıfa gidin ve temel ve türetilmiş sınıflarını bulun


3
Bu aslında potansiyel olarak yararlı bir görüştür. Ne yazık ki, inanılmaz derecede yavaş, mevcut editörü bağlamıyor / takip etmiyor ve genellikle VS'de sonradan düşünülmüş gibi geliyor.
E-Riz

Bu sadece çözümünüzdekileri değil tüm sınıfları gösterir ve kutudan çıkar çıkmaz çalışır. Yavaş değil. Daha grafik benzeri bir görünüm için Class Diagram yerleşik özelliğini de kullanın (ancak yalnızca çözümünüzdeki sınıfları görüntüler). İhtiyacım olan tek şey bu ve en iyi cevap bu.
Nikos

5

Reflektörü de kullanabilirsiniz .

Bakmasını istediğiniz tüm montajları yükleyin, bir türe gidin ve Türetilmiş Türler öğesini genişletin.

Bunu Nesne Tarayıcısı'nda da yapabilirsiniz, ancak bazı nedenlerden dolayı VS2008 bunu yalnızca .Net Framework görünümlerinden birinde yapabilir. (VS2010 Beta 2 herhangi bir görünümde yapabilir)


3
Reflektör artık paraya mal oluyor, ancak ILSpy aynısını ücretsiz olarak yapacak.
yoyo

30 günlük ücretsiz deneme var, ancak süresiz olarak kullanabileceğiniz ücretsiz bir sürüm yok. Bilmediğim bir şey bilmiyorsan? Ben sadece reflector.net'i kontrol ettim .
yoyo

1
Afedersiniz; Reflector'ın hala ücretsiz bir sürümü vardı. Ne zaman kurtuldular?
SLaks


3
Gerçekten dehşet verici olan şey, o tarihten sonra, daha önce indirdiğiniz ücretsiz sürümün bir kopyasını çalıştırdıysanız, redgate (Reflector aldılar) eski ücretsiz sürümü SİLDİ, deneme sürümüyle değiştirdi. Herhangi bir uyarı olmadan. Ve "yükseltme" önlemek için hiçbir seçenek. Bu doğru: Şirketin web sitesine gitmedim ve onlardan hiçbir şey indirmedim. Ancak eski ReSharper'da kendilerine yönlendirilen ve sahip olduğum kopyayı devre dışı bırakmalarına izin veren lisans mantığı vardı. Hiçbir koşulda hiçbir zaman redgate'ten bir şey almamayı ya da onların varlığını teşvik etmeyi yemin ettim.
ToolmakerSteve


4

Yardımıyla ReSharper sadece (sürüm 2016/01/02) Ctrl+ Alt+ ClickBaz Class. Bunun gibi bir şey göreceksiniz:

türetilmiş sınıflara bakın reSharper


1
+1 Güzel! Öyleyse listede kalın harflerle gösterilen sınıf adları doğrudan seçilen temel sınıftan miras alıyor ve listedeki kalın olmayan sınıf adları dolaylı olarak seçilen temel sınıftan miras alıyor?
Simon Bosley

Kesinlikle. Bald doğrudan miras kalan sınıflar olacak.
Devid


1

türü seçin ve sağ tıklayın bir şey görmek --- kod haritasında göster - seçenek seçin Bu tür .dgml dosya biçimi olarak çok güzel bir görüntü olarak devralınanlar için görüntü formet oluşturmak tür hakkında çok daha fazla bilgi verir


1

Visual Assist kullananlar için bir seçenek olarak, "Goto Related" bağlam menüsünü getirmek için Shift + ALT + G tuşlarına da basabilirsiniz (sınıf adı üzerindeyken) ve türetilmiş sınıflar varsa bir alt menü alacaksınız çünkü bunların hepsini listeler ve hatta türetilmiş sınıflar arasında kalıtım yapılarını gösterir.


0

Sadece kodlayın.

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
Ne yazık ki bu sadece belirli bir sınıftan miras alan türleri belirtir, dolaylı olarak bir sınıftan miras alanları değil. Bunun için muhtemelen MZN'nin yazdığı gibi bir şey kullanmanız gerekir.
user420667

Veya t.IsSubClassOf (targetclass) kullanabilirsiniz.
user420667

0

VS2012 sürümüne geçtiyseniz "Kod Haritası" nı kullanabilirsiniz.
Miras hiyerarşisini görüntülemek istediğiniz türe sağ tıklayın ve "Kod haritasına ekle" yi seçin. Daha sonra kod haritası görünümünde düğümleri genişletebilir ve "Türetilmiş / Temel sınıfları göster" i seçmek için sağ tıklayabilirsiniz. Ne yazık ki sağlanan .NET sınıfları için çalışmıyor.


4
Herkes için FYI, bu sadece Güncelleme 1 kurulu olan VS2012 Ultimate için geçerlidir. Premium / Profesyoneller maalesef bu haritaları oluşturamaz.
Sean Hanley

0

Visual Studio 2012 için ( ReSharper Olmadan )

  1. Solution Explorer'da (türetilmiş sınıflarını görmek istediğiniz) sınıfa sağ tıklayın.
  2. Sınıf şemasında, sınıfa sağ tıklayın ve 'Türetilmiş sınıfları göster'i seçin.

1
Yine, söyleyebildiğim kadarıyla sadece yazdığınız türetilmiş sınıfları gösterecektir. Bu, orijinal soruda belirtilen örnekle nasıl çalışır? (ActionResult türleri)
Dan Esparza

0

2020 güncellemesi:

Visual Studio'nun Kod Haritalarını kullanabilirsinizOldukça iyi çalışan .

Basitçe sağa sınıf ve gezindiğini tıklayın:
Code Map> Show Related Items on Code Map>Show All Derived Types

resim açıklamasını buraya girin

Not:

  • Bu özellik kullanılabilir sadece Visual Studio Enterprise sürümü ve eğer yoksa , bunu elde edebilirsiniz ücretsiz Enterprise Önizleme sürümü indirerek burada .
  • Veya ekibinizdeki herhangi bir kimsenin kod özelliğini bu özelliğe sahip olması durumunda bu özellikle paylaşmasını isteyebilirsiniz .

Not: Diğer sürümlerde bulunmayan gerçekten kullanışlı araçlara sahip olduğu için Enterprise sürümünü (veya en azından Önizleme sürümünü) makinenizde tutmaya gerçekten değer .


1
Bu sadece sizin kaynağınız olan tipler için işe yarıyor gibi görünüyor. Gibi şeyler değil ActionResult(OP örneği)
Iain

-1

Bunu yapmanın çok basit bir yolu : Classname, "Pencereyi Bul ve Değiştir" (CTRL + F) 'de arama yapmak ve "Seçenekleri Bul / Tüm kelimeyi eşleştir" seçeneğini kullanmaktır. Yalnızca miras alınan sınıfları bulacaksınız.


1
Bu her seferinde işe yaramıyor, düşününclass DDerived : IInterface, BBase
jirkamat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.