Visual Studio : 기본 클래스에서 상속 된 모든 클래스를 표시하려면 어떻게합니까?


139

Visual Studio에서 기본 클래스에서 상속 된 모든 클래스를 표시하려면 어떻게합니까?

예를 들어 ASP.NET MVC에는 몇 가지 ' ActionResult '형식이 있으며 모두 기본 클래스에서 상속 / 구현합니다 ActionResult.

당신은 그냥 '알고'하지 않는 것 같습니다 ViewJson유효 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

3
이 경우 사용중인 코드가 솔루션에 직접 나타나는 코드가 아닙니다. 다른 어셈블리의 MVC 프레임 워크 클래스입니다. 어셈블리에서 사용하는 코드에는 ": ActionResult"를 검색해도 작동하지 않습니다.
Dan Esparza

답변:


50

물론, Resharper 는 이것을 할 수 있습니다. 그리고 훨씬 더.

아무 곳에서나 유형 이름을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 "상속자로 이동"을 선택하십시오. 오버라이드를 탐색하는 메소드 및 인터페이스 메소드의 구현에도 "Go To Inheritor"를 적용 할 수 있습니다. 인터페이스의 경우 모든 확장 및 구현을 찾을 수있는 위치에서 마우스 오른쪽 버튼을 클릭하여 "고급 고급 찾기"를 다시 호출 할 수 있습니다. 유형-파생 유형의 경우 그리고 내가 가장 좋아하는 기능은 선언으로 이동하기 위해 모든 유형 / 방법에서 Control을 누른 상태에서 클릭하십시오.

.net 개발자에게는 필수 도구라고 생각합니다.


Resharper 9.2에서 소스 코드의 모든 유형에 대해 "사용 고급 찾기"를 마우스 오른쪽 단추로 클릭하고 찾기 = "파생"및 범위 = "솔루션 및 라이브러리"를 선택하십시오.
예를 들어, 공급 업체의 포함 된 DLL에 포함 된 일부 기본 클래스의 모든 상속자 (라이브러리와 코드 모두)를 찾으려면 해당 기본 클래스를 사용하여 코드에 변수를 선언하십시오. 그런 다음 방금 입력 한 기본 클래스 이름을 마우스 오른쪽 단추로 클릭하십시오.


6
그런 수치심. 무료 Eclipse를 사용하는 Java 개발자는이 기능을 즉시 사용할 수 있습니다. Resharper + VS2015에서는 "상속자로 이동"이 아닌 "구현으로 이동"을 봅니다.
북극

1
그러나 이것은 나에게 중간에 수업을주지 않고 나뭇잎 만 나옵니다. CTRL + ALT + B가 답을 줄 것입니다.
북극

2
Visual Studio 6은 거의 20 년 전에 C ++ 프로젝트에서 사용되었습니다. 객체 브라우저와 클래스 다이어그램은 상속 트리를 뒤집는 동일한 경량 기능을 제공하지 않습니다. 나는 최근 이클립스가 적어도 자바와 함께 훌륭한 버전을 가지고 있음을 발견했다. MS에 와서 전 개발자 중 한 명에게 전화를 걸어서 잃어버린 것이 무엇인지 물어보십시오 .... 모든 프로젝트에서 컴파일 후 BSC 찾아보기 데이터 생성 옵션이 필요했지만 괜찮 았습니다. 정말 그렇습니다.
Philip Beck

150

VS2012의 경우

  1. 솔루션 탐색기에서 파일로 이동
  2. 수업 확장 및 선택
  3. 파일 항목이 아닌 클래스 항목을 마우스 오른쪽 단추로 클릭-파생 유형

9
이것은 당신이 작성한 소스 코드를 가정합니다. 이것이 원래 질문에 명시된 예와 어떻게 작동합니까? (ActionResult 유형)
Dan Esparza

ActionResult에서 파생 된 유형이있는 경우 해당 유형을 마우스 오른쪽 단추로 클릭하고 기본 유형을 선택하면 ActionResult로 이동하여 이제 마우스 오른쪽 단추를 클릭하고 파생 된 유형을 선택할 수 있습니다. (ActionResult에서 파생 된 형식이 없으면 System.Object로 돌아간 다음 ActionResult로 내려갈 수 있습니다.)
yoyo

21
나와 같은 클래스의 코드 파일을 마우스 오른쪽 버튼으로 클릭하고 "파생 된 유형"메뉴 옵션이없는 이유를 알게 된 사람들은 먼저 클래스 파일을 표시하기 위해 코드 파일 항목을 확장해야한다는 사실을 기억하십시오. 마우스 오른쪽 버튼으로 클릭.
BCA

3
VS 2017을 사용하고 있습니다. 불행히도 이것은 동일한 어셈블리에 존재하는 클래스 만 표시하며 전체 솔루션을 표시하지는 않습니다.
NightOwl888

4
이 기능이 솔루션 탐색기에 존재하지만 클래스 뷰에는 존재하지 않는 것이 이상합니다.
Dai

73

이를 위해 반드시 Reflector가 필요하지는 않습니다. Visual Studio의 "클래스 다이어그램"뷰를 사용하면 특정 클래스에 대한 모든 파생 클래스를 쉽게 찾을 수 있습니다. "클래스 뷰"에서 클래스를 마우스 오른쪽 버튼으로 클릭하고 "클래스 다이어그램보기"를 선택하십시오. 다이어그램에 계층에 대한 세부 수준이 표시되지 않으면 다이어그램에서 클래스 상자를 마우스 오른쪽 단추로 클릭하고 "파생 클래스 표시"를 선택하십시오.

Resharper만큼 직접적이지는 않지만 R #이없는 경우 옵션입니다.

불행히도, Visual Studio의 특정 버전이 있는지 확실하지 않습니다.


15
이렇게하면 솔루션 내에서 대상 클래스 / 인터페이스를 상속 / 구현하는 클래스 만 볼 수 있습니다. 그래도 반갑습니다.
Markus Jarderot

이 방법의 한계에 대해 알고 있습니까? 모든 하위 클래스를 볼 수 없기 때문에 추가 인터페이스를 구현하지 않는 하위 클래스 만 표시하는 것 같습니다.
8:27에

1
나는 그것이 현재 프로젝트의 유형에 국한되지 솔루션의 생각, 그래서 "현재 프로젝트에 XXX에서 파생 어떤 유형이 없습니다"라는 오류 있어요
앤디

"파생 클래스 표시"를 재귀 적으로 수행 할 수 있습니까? 또는 모든 하위 클래스에서 "파생 클래스 표시"를 명시 적으로 선택해야합니까?
제임스 Wierzba

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

@ToolmakerSteve, 어떻 AppDomain.CurrentDomain.GetAssemblies()습니까? 이것을보세요 : stackoverflow.com/questions/851248/…
Mzn

14

'Visual Studio 2015 업데이트 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에서는 작동합니다. 그래서 답변을 찬성했습니다
João Antunes

1
좋네요 불행히도, 계층 구조 트리를 표시하지 않습니다 ... 나는 동일한 트리 수준으로 모두 나열합니다.
Lombas

그리고 항상 이름이 가짜이므로 검색 / 사용 중에 완전히 간과하고 그것을 찾으려면 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 항목을 마우스 오른쪽 버튼으로 클릭 하고이 단계를 수행하면 'Controller'(포함 클래스의 유형)에 대한 'Inspect'옵션이 표시됩니다. 'ViewResult'정의로 이동하려고하면 메타 데이터에 있고 계층 검사 옵션이 없습니다.
Dan Esparza

1
또한 :이 ReSharper에서 제공하는 기능입니다 상당히 확신, 그것은 ... Visual Studio에서 기본적으로 아니에요
댄 에스파 르자

7

Visual Studio 클래스 뷰 사용해보기

Visual Studio 클래스 뷰에서 관심있는 클래스로 이동하여 기본 클래스와 파생 클래스를 찾으십시오.


3
이것은 실제로 유용한 견해입니다. 안타깝게도 속도가 매우 느리고 현재 편집기를 연결 / 따르지 않으며 일반적으로 VS에서 생각합니다.
E-Riz

여기에는 솔루션의 클래스뿐만 아니라 모든 클래스가 표시되며 즉시 사용할 수 있습니다. 느리지 않습니다. 보다 그래프와 같은보기를 위해 클래스 다이어그램 내장 기능도 사용하십시오 (그러나 솔루션 내의 클래스 만 표시 함). 이것이 내가 필요로하는 전부이며 이것이 최선의 대답입니다.
Nikos

5

리플렉터를 사용할 수도 있습니다 .

찾고자하는 모든 어셈블리를로드하고 유형으로 이동 한 다음 파생 유형 항목을 확장합니다.

개체 브라우저에서도이 작업을 수행 할 수 있지만 어떤 이유로 VS2008은 .Net Framework보기 중 하나에서만 작업을 수행 할 수 있습니다. (VS2010 Beta 2는 모든보기에서 가능)


3
반사기는 이제 비용이 들지만 ILSpy는 무료로 똑같이 할 것입니다.
yoyo

30 일 무료 평가판이 있지만 무기한으로 사용할 수있는 무료 버전은 없습니다. 내가 모르는 것을 모르면? 그냥 reflector.net 확인했습니다 .
yoyo

1
죄송합니다; 리플렉터는 여전히 무료 버전을 가지고있었습니다. 그들은 언제 그것을 제거 했습니까?
SLaks

2011 년 2 월 2 일 -zdnet.com/blog/burnette/…
yoyo

3
정말 끔찍한 것은 그 날짜 이후에 이전에 다운로드 한 무료 버전의 사본을 실행 한 경우 이전 무료 버전을 삭제하고 시험판으로 대체한다는 것입니다 (Reflector를 구입했습니다). 경고없이. "업그레이드"를 피할 수있는 옵션이 없습니다. 맞습니다. 회사 웹 사이트로 이동하지 않았으며 웹 사이트에서 아무것도 다운로드하지 않았습니다. 그러나 이전 ReSharper에는 라이센스 로직이 있었으며이 라이센스는 리다이렉션되었고 내가 보유한 사본을 비활성화 할 수있었습니다. 나는 어떤 상황에서도 절대로 레드 게이트에서 물건을 사거나 그들의 존재를 장려하지 않겠다고 다짐했다.
ToolmakerSteve


4

ReSharper (버전 2016.1.2) 의 도움으로 기본 클래스에서 Ctrl+ Alt+ 만 가능 Click합니다. 다음과 같은 것을 보게 될 것입니다 :

파생 클래스 참조 reSharper


1
+1 니스! 목록에 굵은 체로 표시된 클래스 이름 은 선택한 기본 클래스에서 직접 상속되고 굵게 표시되지 않은 목록의 클래스 이름 은 선택한 기본 클래스에서 간접적으로 상속되는 것 같습니다.
Simon Bosley

바로 그거죠. 대머리는 직접 상속되는 클래스입니다.
DEVID


1

유형을 선택하고 마우스 오른쪽 버튼을 클릭하십시오. --- 코드 맵에 표시 --option 선택하십시오.이 유형을 .dgml 파일 형식과 같은 매우 좋은 이미지로 상속받는 사람들을 위해 이미지 형식을 생성하십시오.


1

Visual Assist를 사용하는 사용자를위한 옵션으로 Shift + ALT + G (캐럿이 클래스 이름에있는 동안)를 눌러 "Goto Related"컨텍스트 메뉴를 표시 할 수 있으며 파생 된 클래스가 있으면 하위 메뉴가 표시됩니다 그것들을 모두 나열하고 파생 클래스 사이의 상속 구조를 보여줍니다.


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

0

VS2012로 업그레이드 한 경우 "코드 맵"을 사용할 수 있습니다.
상속 계층을 보려는 유형을 마우스 오른쪽 버튼으로 클릭하고 "코드 맵에 추가"를 선택하십시오. 그런 다음 코드 맵보기에서 노드를 확장하고 마우스 오른쪽 단추를 클릭하여 "파생 / 기본 클래스 표시"를 선택할 수 있습니다. 불행히도 .NET 제공 클래스에서는 작동하지 않습니다.


4
참고로, 이는 업데이트 1이 설치된 VS2012 Ultimate에만 적용됩니다. 불행히도 프리미엄 / 프로 사람들은이지도를 만들 수 없습니다.
Sean Hanley

0

Visual Studio 2012의 경우 ( ReSharper 제외)

  1. 솔루션 탐색기에서 클래스 (보려는 파생 클래스)를 마우스 오른쪽 단추로 클릭하십시오.
  2. 클래스 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭하고 '파생 클래스 표시'를 선택하십시오.

1
다시 말하지만, 내가 말할 수있는 한, 당신이 작성한 파생 클래스 만 표시됩니다. 이것이 원래 질문에 명시된 예와 어떻게 작동합니까? (ActionResult types)
Dan Esparza

0

2020 년 업데이트 :

꽤 잘 작동 하는 Visual Studio의 코드 맵 을 사용할 수 있습니다 .

간단하게 오른쪽에있는 클래스와 탐색을 클릭합니다 :
Code Map> Show Related Items on Code Map>Show All Derived Types

여기에 이미지 설명을 입력하십시오

노트 :

  • 이 기능은 Enterprise 버전의 Visual Studio 에서만 사용할 수 있으며 , 없는 경우 여기 에서 Enterprise Preview 버전을 다운로드하여 무료 로받을 있습니다 .
  • 또는 팀의 누군가에게 해당 기능 있는 경우이 기능 과 함께 코드 맵을 공유하도록 요청할 수 있습니다 .

PS 다른 버전에는 포함되지 않은 유용한 도구 가 많이 있으므로 시스템에 Enterprise 버전 (또는 최소한 Preview 버전)을 유지하는 것이 좋습니다 .


1
소스가있는 유형에서만 작동하는 것 같습니다. ActionResult(OP의 예) 와 같은 것은 아님
14:01의 Iain

-1

이를 수행하는 가장 간단한 방법 : Classname은 "찾기 및 바꾸기 창"(CTRL + F)에서 검색하고 "옵션 찾기 / 전체 단어 일치"옵션을 사용하는 것입니다. 상속 된 클래스 만 찾을 수 있습니다.


1
이것은 매번 작동하지 않습니다. 다음을 고려하십시오class DDerived : IInterface, BBase
jirkamat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.