Visual Studio: jak wyświetlić wszystkie klasy odziedziczone z klasy bazowej?


139

W programie Visual Studio, jak wyświetlić wszystkie klasy dziedziczone z klasy bazowej?

Na przykład w ASP.NET MVC istnieje kilka typów „ ActionResult ” - i wszystkie one dziedziczą z / implementują klasę bazową ActionResult.

Wygląda na to, że jeśli nie „wiesz” tego Viewi nie Jsonsą to prawidłowe ActionResulttypy, nie ma sposobu, aby łatwo znaleźć te informacje.

Proszę udowodnij mi, że się mylę.

Czy jest coś w przeglądarce obiektów, co sprawia, że ​​łatwo to sprawdzić?

Jestem nawet gotowy na sugestie dotyczące narzędzi spoza Visual Studio, aby odkryć te informacje o różnych klasach. Na przykład: czy jest coś w Resharper, co mi pomoże?


2
W Visual C # 2010 Express wyszukuję rozwiązanie dla „: ActionResult”. Nie idealne, ale lepsze niż nic.
yoyo

2
Myślę, że źle zrozumiałeś moje pytanie. JsonResult (odwołanie tutaj: msdn.microsoft.com/en-us/library/system.web.mvc.jsonresult.aspx ) dziedziczy po ActionResult. Istnieje kilka innych klas, które dziedziczą po ActionResult. Jaki jest łatwy sposób, aby zobaczyć wszystkie klasy dziedziczące po ActionResult?
Dan Esparza

3
W tym przypadku kod, którego używam, nie jest kodem, który pojawia się bezpośrednio w moim rozwiązaniu. Są to klasy struktury MVC w innym zestawie. Wyszukiwanie „: ActionResult” nie będzie działać dla żadnego kodu, którego używam z zestawu.
Dan Esparza

Odpowiedzi:


50

Jasne, Resharper może to zrobić. I wiele więcej.

Wystarczy kliknąć prawym przyciskiem myszy nazwę typu w dowolnym miejscu i wybrać „Przejdź do dziedziczenia” z menu kontekstowego. „Idź do dziedziczenia” można również zastosować do metody nawigacji po przesłonięciach i implementacji metod interfejsu. W przypadku interfejsu możesz ponownie wywołać „Znajdź zastosowania zaawansowane”, klikając prawym przyciskiem myszy), gdzie można znaleźć wszystkie rozszerzenia i implementacje. Dla typów pochodnych typu. I moja ulubiona funkcja - kliknij z przytrzymaniem Control na dowolnym typie / metodzie, aby przejść do jego deklaracji.

Myślę, że to niezbędne narzędzie dla programistów .net.


W Resharper 9.2, dla dowolnego typu kodu źródłowego, kliknij prawym przyciskiem myszy „Znajdź użycie zaawansowane”, wybierz Znajdź = „Pochodne” i Zakres = „Rozwiązania i biblioteki”.
Na przykład, aby znaleźć wszystkie elementy dziedziczące (zarówno w bibliotece, jak i kodzie) jakiejś klasy bazowej w dołączonej bibliotece DLL od dowolnego dostawcy, zadeklaruj zmienną w kodzie z tą klasą bazową. Następnie kliknij prawym przyciskiem myszy właśnie wpisaną nazwę klasy bazowej.


6
Taki wstyd. Programiści Java, którzy używają darmowego Eclipse, mają tę funkcję po wyjęciu z pudełka. W moim programie Resharper + VS2015 widzę „przejdź do implementacji” zamiast „Przejdź do dziedziczenia”.
Biegun Północny

1
Ale to nie daje mi zajęć w środku, tylko odchodzi. CTRL + ALT + B dałoby odpowiedź.
Biegun Północny

2
Visual Studio 6 miał go w projektach C ++ prawie 20 lat temu. Przeglądarka obiektów i diagram klas nie zapewniają tej samej niewielkiej możliwości odwracania drzew dziedziczenia. Niedawno odkryłem, że Eclipse ma świetną wersję tego, przynajmniej z Javą. No dalej, MS, zadzwoń do jednego z twoich byłych programistów i zapytaj, co takiego straciłeś, ale straciłeś… To prawda, że ​​wymagało to od wszystkich projektów, aby generowały dane przeglądania BSC po kompilacji, ale to było w porządku. To naprawdę było.
Philip Beck

150

Dla VS2012,

  1. Przejdź do pliku w eksploratorze rozwiązań
  2. Rozwiń i wybierz swoją klasę
  3. Kliknij prawym przyciskiem myszy element klasy (nie element pliku) -> Typy pochodne

9
Zakłada się, że napisałeś kod źródłowy. Jak by to działało z przykładem podanym w pierwotnym pytaniu? (Typy ActionResult)
Dan Esparza

Jeśli masz typ, który pochodzi z ActionResult, możesz kliknąć prawym przyciskiem myszy swój typ i wybrać Typy podstawowe, co przeniesie Cię do ActionResult, który możesz teraz kliknąć prawym przyciskiem myszy i wybrać Typy pochodne. (Jeśli nie masz typu, który pochodzi z ActionResult, możesz wrócić do System.Object, a następnie do ActionResult.)
yoyo

21
Dla tych z Was, którzy, tak jak ja, kliknęli prawym przyciskiem myszy plik kodu klasy i byli zaskoczeni, dlaczego nie ma opcji menu „typy pochodne”: pamiętajcie, że musieli najpierw rozwinąć element pliku kodu, aby odsłonić element klasy - a następnie kliknij prawym przyciskiem myszy.
BCA

3
Używam VS 2017. Niestety, to pokazuje tylko klasy, które istnieją w tym samym zestawie, nie pokazuje całego rozwiązania.
NightOwl888

4
To dziwne, jak ta funkcja istnieje w Eksploratorze rozwiązań, ale nie w widoku klas.
Dai

73

Niekoniecznie potrzebujesz do tego reflektora - widok „Diagram klas” w programie Visual Studio pozwoli Ci łatwo znaleźć wszystkie klasy pochodne dla określonej klasy. Kliknij prawym przyciskiem myszy klasę w „Widok klas” i wybierz „Wyświetl diagram klas”. Jeśli diagram nie pokazuje poziomu szczegółowości, jaki chcesz uzyskać dla hierarchii, kliknij prawym przyciskiem myszy pole klasy na diagramie i wybierz „Pokaż klasy pochodne”.

Może nie być tak bezpośredni jak Resharper, ale jest to opcja, jeśli nie masz jeszcze R #.

Niestety nie jestem pewien, które wersje Visual Studio go zawierają.


15
Umożliwi to tylko przeglądanie klas w ramach rozwiązania, które dziedziczą / implementują docelową klasę / interfejs. Dobrze jednak wiedzieć.
Markus Jarderot

Czy wiesz o ograniczeniach tej metody? Ponieważ nie pozwala mi zobaczyć wszystkich podklas (wydaje się, że pokazuje tylko podklasy, które nie implementują żadnych dodatkowych interfejsów).
Serge

1
Pojawił się błąd z informacją „Nie ma typów, które pochodzą z XXX w obecnym projekcie”, więc myślę, że jest to ograniczone do typów w bieżącym projekcie, a nie rozwiązanie
Andy

Czy mogę rekurencyjnie wykonywać „Pokaż klasy pochodne”? A może muszę jawnie wybrać opcję „Pokaż klasy pochodne” dla każdej podklasy?
James Wierzba

15

To najmniej leniwa odpowiedź (jestem po prostu dumny z tej odpowiedzi :)

Nie mam ReSharper, próbowałem go wcześniej, ale nie chciałem go kupić. Wypróbowałem diagram klas, ale nie jest to w ogóle praktyczne, ponieważ diagram hierarchii obejmuje świat 3 razy, a ekran mojego laptopa nie ma nieskończonej szerokości. Więc moim naturalnym i łatwym rozwiązaniem było napisanie kodu Windows Forms, aby iterować po typach w zestawie i użyć odbicia, aby dodać węzły do ​​widoku drzewa, w następujący sposób:

proszę załóżmy, że masz pole tekstowe, widok drzewa i inne rzeczy potrzebne w formularzu, w którym działa ten kod

//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 za fajny przykład kodu. A co z klasami bazowymi i pochodnymi w innych zestawach?
ToolmakerSteve

@ToolmakerSteve, a co powiesz na to AppDomain.CurrentDomain.GetAssemblies()? Spójrz na to: stackoverflow.com/questions/851248/…
Mzn

14

Zaczynając od „Visual Studio 2015 Update 1”, możesz po prostu kliknąć prawym przyciskiem myszy nazwę klasy w edytorze kodu klasy, a następnie wybrać „Przejdź do implementacji” z menu kontekstowego: ze skrótem Ctrl + F12.

Więcej informacji można znaleźć pod adresem https://blogs.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-languages/ .


1
Doceniam tę wskazówkę, ale nie jestem pewien, czy dotyczy to mojego pierwotnego przypadku użycia polegającego na wyświetlaniu wszystkich dziedziczonych klas z klasy bazowej.
Dan Esparza

3
@DanEsparza: tak, przynajmniej w VS2017. Więc zagłosowałem za odpowiedzią
João Antunes,

1
To miłe. Niestety, nie pokazuje drzewa hierarchii ... Po prostu wymieniam wszystkie na tym samym poziomie drzewa.
Lombas

I jak zawsze nazwa jest fałszywa, całkowicie przeoczyłem ją podczas mojego wyszukiwania / używania, musiałem przyjść do StackOverflow, aby ją znaleźć!
dim8

10

Nikt jeszcze o tym nie wspomniał, więc dodam to.
Jetbrains dotPeek to darmowy dekompilator .NET, który umożliwia łatwe wyświetlanie tych informacji.

Bezpłatne pobieranie: http://www.jetbrains.com/decompiler/

Jetbrains to firma, która produkuje Resharper.

Kroki do znalezienia klas pochodnych:

  1. Uruchom dotPeek
  2. Wybierz „Otwórz z GAC ...” i dodaj zestaw System.Web.MVC
  3. Wybierz „Nawiguj / Idź, aby wpisać” i wpisz ActionResult
  4. W ActionResultdeklaracji klasy kliknij prawym przyciskiem myszy i wybierz opcję „Symbole pochodne”
  5. Voila! Wyświetlana jest każda klasa pochodna (nawet kilka, o których nie wiedziałem!)

7

Zakładając, że masz zainstalowany Resharper : z kursorem na klasie / interfejsie kliknij prawym przyciskiem myszy - Sprawdź - Hierarchie

To pokazuje podklasy, implementacje i nadklasy.


Hmmm ... ciekawe, ale nie to, czego szukałem. Jeśli kliknę prawym przyciskiem myszy zwrócony element ActionResult i wykonam następujące kroki, otrzymam opcje „Sprawdź” dla „Kontrolera” (typ klasy zawierającej). Jeśli spróbuję przejść do definicji „ViewResult”, jestem w metadanych i nie mam opcji sprawdzania hierarchii.
Dan Esparza

1
Ponadto: Jestem prawie pewien, że jest to funkcja dostarczona przez Resharper, nie jest natywnie w Visual Studio ...
Dan Esparza,

7

Wypróbuj widok klasy programu Visual Studio

W widoku klas programu Visual Studio przejdź do klasy, która Cię interesuje, i znajdź jej klasy podstawowe i pochodne


3
W rzeczywistości jest to potencjalnie przydatny widok. Niestety, jest niewiarygodnie powolny, nie łączy się z obecnym edytorem ani nie podąża za nim i ogólnie wydaje się być refleksją w VS.
E-Riz

Pokazuje wszystkie klasy, a nie tylko te w rozwiązaniu, i działa od razu po wyjęciu z pudełka. Nie jest wolny. Aby uzyskać widok bardziej podobny do wykresu, użyj również wbudowanej funkcji Diagram klas (ale wyświetla ona tylko klasy w rozwiązaniu). To wszystko, czego kiedykolwiek potrzebowałam i to jest najlepsza odpowiedź.
Nikos

5

Możesz także użyć Reflectora .

Załaduj wszystkie zespoły, w których ma wyglądać, przejdź do typu i rozwiń element Typy pochodne.

Możesz to również zrobić w przeglądarce obiektów, ale z jakiegoś powodu VS2008 może to zrobić tylko w jednym z widoków .Net Framework. (VS2010 Beta 2 może to zrobić w dowolnym widoku)


3
Reflector kosztuje teraz pieniądze, ale ILSpy zrobi to samo za darmo.
jojo

Dostępna jest 30-dniowa bezpłatna wersja próbna, ale nie ma bezpłatnej wersji, z której można korzystać w nieskończoność. Chyba że wiesz coś, czego ja nie wiem? Właśnie sprawdziłem reflector.net .
jojo

1
Przepraszam; Reflector wciąż miał darmową edycję. Kiedy się go pozbyli?
SLaks


3
Co było naprawdę przerażające, to to, że po tej dacie, jeśli uruchomiłeś kopię bezpłatnej wersji, którą wcześniej pobrałeś, redgate (kupili Reflector) USUŃ starą darmową wersję, zastępując ją wersją próbną. Bez żadnego ostrzeżenia. I nie ma możliwości uniknięcia „aktualizacji”. Zgadza się: nie wszedłem na stronę firmy i nic z niej nie pobrałem. Ale w starym ReSharper była logika licencjonowania, która została do nich przekierowana i pozwoliła im dezaktywować kopię, którą miałem. Przysiągłem sobie, że nigdy, przenigdy, w żadnych okolicznościach nie kupię niczego od redgate ani w inny sposób nie będę zachęcał ich do istnienia.
ToolmakerSteve


4

Z pomocą ReSharper (wersja 02.01.2016) tylko Ctrl+ Alt+ Clickw klasie bazowej. Zobaczysz coś takiego:

zobacz klasy pochodne reSharper


1
+1 Świetnie! Wygląda więc na to, że nazwy klas, które są pogrubione na liście, bezpośrednio dziedziczą po wybranej klasie bazowej, a nazwy klas na liście, które nie są pogrubione, dziedziczą pośrednio po wybranej klasie bazowej?
Simon Bosley

Dokładnie. Bald będzie bezpośrednio dziedziczącymi klasami.
Devid


1

wybierz typ i kliknij prawym przyciskiem myszy zobacz coś --- pokaż na mapie kodu --opcja wybierz to generuj zestaw obrazów dla tych, którzy dziedziczą ten typ jako bardzo ładny obrazek jak format pliku .dgml daje dużo więcej informacji o typie


1

Jako opcję dla osób używających Visual Assist, możesz także nacisnąć Shift + ALT + G (gdy kursor znajduje się na nazwie klasy), aby wywołać menu kontekstowe „Przejdź do powiązanych”, a jeśli istnieją klasy pochodne, pojawi się podmenu w tym celu wymienia je wszystkie, a nawet pokazuje struktury dziedziczenia wśród tych klas pochodnych.


0

Po prostu zakoduj to.

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
Niestety, informuje to tylko o typach, które dziedziczą bezpośrednio z określonej klasy, a nie o tych, które są pośrednio dziedziczone z klasy. W tym celu prawdopodobnie musiałbyś użyć czegoś takiego, jak napisał MZN.
user420667

Lub możesz użyć t.IsSubClassOf (targetclass).
user420667

0

jeśli dokonałeś aktualizacji do VS2012, możesz użyć „mapy kodu”.
Kliknij prawym przyciskiem myszy typ, dla którego chcesz wyświetlić hierarchię dziedziczenia, i wybierz opcję „Dodaj do mapy kodu”. Następnie w widoku mapy kodu można rozwinąć węzły i kliknąć prawym przyciskiem myszy, aby wybrać opcję „Pokaż klasy pochodne / podstawowe”. Niestety nie działa to w przypadku klas udostępnionych .NET.


4
Do Twojej wiadomości dla kogokolwiek innego, dotyczy to tylko VS2012 Ultimate z zainstalowaną aktualizacją 1. Użytkownicy Premium / Pro nie mogą niestety tworzyć tych map.
Sean Hanley,

0

Dla programu Visual Studio 2012 ( bez ReSharper )

  1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy klasę (której klasy pochodne chcesz wyświetlić).
  2. Na diagramie klas kliknij prawym przyciskiem myszy klasę i wybierz „Pokaż klasy pochodne”.

1
Znowu, o ile mogę powiedzieć, pokaże to tylko klasy pochodne, które napisałeś. Jak by to działało z przykładem podanym w pierwotnym pytaniu? (Typy ActionResult)
Dan Esparza

0

Aktualizacja 2020:

Możesz użyć map kodu programu Visual Studio, które działają całkiem dobrze.

Wystarczy kliknąć prawym przyciskiem myszy na klasę i przejdź do:
Code Map> Show Related Items on Code Map>Show All Derived Types

wprowadź opis obrazu tutaj

Uwaga:

  • Ta funkcja jest dostępna tylko w wersji Enterprise programu Visual Studio, a jeśli nie masz , możesz ją pobrać bezpłatnie , pobierając stąd wersję Enterprise Preview .
  • Możesz też po prostu poprosić kogoś z zespołu o udostępnienie mapy kodu z funkcją, jeśli ma tę edycję.

PS Naprawdę warto zachować wersję Enterprise (lub przynajmniej jej wersję Preview) na swoim komputerze, ponieważ zawiera ona kilka naprawdę przydatnych narzędzi , których nie ma w innych wydaniach.


1
Wygląda na to, że działa to tylko w przypadku typów, dla których masz źródło. Nie takie rzeczy jak ActionResult(przykład OP)
Iain

-1

Bardzo prostym sposobem na to jest wyszukanie : Classnamew oknie „Znajdź i zamień” (CTRL + F) i użycie opcji „Znajdź opcje / Dopasuj całe słowo”. Znajdziesz tylko odziedziczone klasy.


1
To nie działa za każdym razem, rozważclass DDerived : IInterface, BBase
jirkamat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.