Visual Studio: Làm cách nào để hiển thị tất cả các lớp được kế thừa từ một lớp cơ sở?


139

Trong Visual Studio, làm cách nào để hiển thị tất cả các lớp được kế thừa từ một lớp cơ sở?

Ví dụ: trong ASP.NET MVC có một số loại ' ActionResult ' - và tất cả chúng đều kế thừa từ / thực hiện lớp cơ sở ActionResult.

Có vẻ như trừ khi bạn chỉ 'biết' ViewJsonActionResultloại hợp lệ , không có cách nào bạn có thể dễ dàng tìm thấy thông tin này.

Hãy chứng minh tôi sai.

Có một cái gì đó trong trình duyệt đối tượng làm cho điều này dễ dàng để tìm ra?

Tôi thậm chí còn gợi ý các công cụ bên ngoài Visual Studio để khám phá thông tin này về các lớp khác nhau. Ví dụ: có cái gì trong Resharper sẽ giúp tôi không?


2
Với Visual C # 2010 Express, tôi tìm kiếm giải pháp cho ": ActionResult". Không lý tưởng, nhưng tốt hơn là không có gì.
yoyo

2
Tôi nghĩ rằng bạn hiểu sai câu hỏi của tôi. JsonResult (tham khảo tại đây: msdn.microsoft.com/en-us/l Library / system.web.mvc.jsonresult.aspx ) kế thừa từ ActionResult. Có một số lớp khác kế thừa từ ActionResult. Một cách dễ dàng để xem tất cả các lớp kế thừa từ ActionResult là gì?
Dan Esparza

3
Trong trường hợp này, mã mà tôi đang sử dụng không phải là mã xuất hiện trực tiếp trong giải pháp của tôi. Chúng là các lớp khung MVC trong một hội đồng khác. Tìm kiếm ": ActionResult" sẽ không hoạt động đối với bất kỳ mã nào tôi sử dụng từ một hội đồng.
Dan Esparza

Câu trả lời:


50

Chắc chắn, Resharper có thể làm điều này. Và nhiều hơn nữa.

Chỉ cần nhấp chuột phải vào tên loại ở bất kỳ nơi nào và chọn "Chuyển đến Người thừa kế" trong menu ngữ cảnh. "Đi tới người thừa kế" cũng có thể được áp dụng cho phương pháp điều hướng để ghi đè và triển khai phương thức giao diện. Đối với giao diện, bạn có thể gọi lại "Tìm sử dụng nâng cao", chỉ cần nhấp chuột phải) vào nơi để tìm tất cả các phần mở rộng và triển khai. Đối với một loại - các loại dẫn xuất. Và tính năng yêu thích của tôi - nhấp với giữ Control trên bất kỳ loại / phương thức nào để điều hướng đến khai báo của nó.

Tôi nghĩ đó là một công cụ phải có cho các nhà phát triển .net.


Trong Resharper 9.2, trên bất kỳ loại nào trong mã nguồn, rt-click "Tìm cách sử dụng nâng cao", chọn Find = "Derogen" và Scope = "Giải pháp và thư viện".
Ví dụ: để tìm tất cả các thừa kế (cả trong thư viện và mã của bạn) của một số lớp cơ sở trong một DLL được bao gồm từ bất kỳ nhà cung cấp nào, hãy khai báo một biến trong mã của bạn với lớp cơ sở đó. Sau đó bấm chuột phải vào tên lớp cơ sở mà bạn vừa gõ.


6
Thật là ngại quá. Các nhà phát triển Java sử dụng Eclipse miễn phí, có chức năng này ngay lập tức. Trong Resharper + VS2015 của tôi, tôi thấy "đi đến Thực hiện" thay vì "Đi tới Người thừa kế".
Cực Bắc

1
Nhưng điều này không cho tôi các lớp ở giữa, chỉ có lá. CTRL + ALT + B sẽ đưa ra câu trả lời.
Cực Bắc

2
Visual Studio 6 đã có nó trên các dự án C ++ gần 20 năm trước. Trình duyệt đối tượng và sơ đồ lớp không cung cấp khả năng trọng lượng nhẹ như nhau để lật cây thừa kế. Gần đây tôi đã thấy rằng Eclipse có một phiên bản tuyệt vời này, với ít nhất là Java. Hãy đến với MS, gọi điện thoại cho một trong những nhà phát triển cũ của bạn và hỏi xem bạn đã mất gì nhưng đã cấp .... Yêu cầu tất cả các dự án phải có dữ liệu duyệt BSC sau khi tùy chọn biên dịch, nhưng điều đó vẫn ổn. Nó thực sự là.
Philip Beck

150

Đối với VS2012,

  1. Điều hướng đến tập tin trong giải pháp thám hiểm
  2. Mở rộng và chọn lớp của bạn
  3. Nhấp chuột phải vào mục lớp (không phải mục tệp) -> Các loại có nguồn gốc

9
Điều này giả định mã nguồn bạn đã viết. Làm thế nào điều này sẽ làm việc với ví dụ nêu trong câu hỏi ban đầu? (Các loại ActionResult)
Dan Esparza

Nếu bạn có bất kỳ loại nào xuất phát từ ActionResult thì bạn có thể nhấp chuột phải vào loại của mình và chọn Loại cơ sở, sẽ đưa bạn đến ActionResult, giờ đây bạn có thể nhấp chuột phải vào và chọn Loại có nguồn gốc. (Nếu bạn không có loại xuất phát từ ActionResult thì bạn có thể quay trở lại System.Object và sau đó xuống ActionResult.)
yoyo

21
Đối với những người như tôi, nhấp chuột phải vào tệp mã của lớp và bị bối rối tại sao không có tùy chọn trình đơn "loại dẫn xuất": nhắc lại rằng trước tiên bạn phải mở rộng mục tệp mã để hiển thị mục lớp - sau đó kích chuột phải.
BCA

3
Tôi đang sử dụng VS 2017. Thật không may, điều này chỉ hiển thị các lớp tồn tại trong cùng một cụm, nó không hiển thị toàn bộ giải pháp.
NightOwl888

4
Thật kỳ lạ khi chức năng này tồn tại trong Solution Explorer chứ không phải Class View.
Đại

73

Bạn không nhất thiết cần Reflector cho việc này - Chế độ xem "Biểu đồ lớp" của Visual Studio sẽ cho phép bạn dễ dàng tìm thấy tất cả các lớp dẫn xuất cho một lớp cụ thể. Nhấp chuột phải vào lớp trong "Chế độ xem lớp" và chọn "Xem sơ đồ lớp". Nếu sơ đồ không hiển thị mức độ chi tiết bạn muốn cho cấu trúc phân cấp, nhấp chuột phải vào hộp cho lớp trong sơ đồ và chọn "Hiển thị các lớp phái sinh".

Có thể không trực tiếp như Resharper, nhưng đó là một tùy chọn nếu bạn chưa có R #.

Thật không may, tôi không chắc chắn phiên bản cụ thể nào của Visual Studio có nó.


15
Điều này sẽ chỉ cho phép bạn xem các lớp trong giải pháp của bạn kế thừa / thực hiện lớp / giao diện đích. Tốt để biết mặc dù.
Markus Jarderot

Bạn có biết về những hạn chế của phương pháp này? Bởi vì nó không cho phép tôi xem tất cả các lớp con (có vẻ như nó chỉ hiển thị các lớp con không thực hiện bất kỳ giao diện bổ sung nào).
Serge

1
Tôi đã gặp lỗi khi nói "Không có loại nào xuất phát từ XXX trong dự án hiện tại", vì vậy tôi nghĩ rằng nó bị giới hạn ở các loại trong dự án hiện tại, không phải là giải pháp
Andy

Tôi có thể thực hiện "Hiển thị các lớp dẫn xuất" một cách đệ quy không? Hay tôi phải chọn "Hiển thị các lớp dẫn xuất" trên mỗi lớp con một cách rõ ràng?
James Wierzba

15

Đây là câu trả lời ít lười nhất (Tôi chỉ tự hào về câu trả lời này :)

Tôi không có ReSharper, đã thử nó trước đây nhưng không muốn mua nó. Tôi đã thử một sơ đồ lớp nhưng hoàn toàn không thực tế vì sơ đồ phân cấp trải khắp thế giới 3 lần và màn hình máy tính xách tay của tôi không có chiều rộng vô hạn. Vì vậy, giải pháp tự nhiên và dễ dàng của tôi là viết một số mã Windows Forms để lặp lại các loại trong một cụm và sử dụng sự phản chiếu để thêm các nút vào chế độ xem dạng cây, như sau:

vui lòng giả sử bạn có hộp văn bản, chế độ xem dạng cây và những thứ khác cần thiết trên một biểu mẫu trong đó mã này chạy

//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 cho một ví dụ mã mát mẻ. Điều gì về các lớp cơ sở và các lớp dẫn xuất trong các hội đồng khác?
ToolmakerSteve

@ToolmakerSteve, làm thế nào AppDomain.CurrentDomain.GetAssemblies()? Hãy xem cái này: stackoverflow.com/questions/851248/
Kẻ

14

Bắt đầu từ 'Visual Studio 2015 Update 1', bạn có thể chỉ cần nhấp chuột phải vào tên lớp trong trình chỉnh sửa mã lớp và sau đó chọn 'Đi đến Thực hiện "từ menu ngữ cảnh: với Ctrl + F12 là phím tắt.

Xem https://bloss.msdn.microsoft.com/dotnet/2015/11/30/whats-new-in-visual-studio-update-1-for-net-managed-lacular/ để biết thêm chi tiết.


1
Tôi đánh giá cao mẹo này, nhưng tôi không chắc điều này giải quyết trường hợp sử dụng ban đầu của tôi khi thấy tất cả các lớp được kế thừa từ một lớp cơ sở.
Dan Esparza

3
@DanEsparza: ít nhất là trong VS2017. Vì vậy, tôi đã đưa ra câu trả lời
João Antunes

1
Nó đẹp. Thật không may, không hiển thị cây phân cấp ... Tôi chỉ liệt kê tất cả trong cùng một cấp cây.
Oliveras

Và như mọi khi tên là không có thật, hoàn toàn bỏ qua nó trong quá trình tìm kiếm / sử dụng của tôi, đã phải đến StackOverflow để tìm thấy nó!
dim8

10

Không ai đã đề cập đến điều này chưa, vì vậy tôi sẽ thêm nó.
Jetbrains dotPeek là một trình dịch ngược .NET miễn phí có khả năng hiển thị thông tin này một cách dễ dàng.

Tải xuống miễn phí: http://www.jetbrains.com/decompiler/

Jetbrains là công ty sản xuất Resharper.

Các bước để tìm các lớp dẫn xuất:

  1. Khởi động dotPeek
  2. Chọn 'Mở từ GAC ...' và thêm cụm System.Web.MVC
  3. Chọn 'Điều hướng / Chuyển đến loại' và nhập vào ActionResult
  4. Trên ActionResultkhai báo lớp, nhấp chuột phải và chọn 'Biểu tượng phái sinh'
  5. Voila! Mỗi lớp dẫn xuất duy nhất được hiển thị (thậm chí một số ít tôi không biết về!)

7

Giả sử bạn đã cài đặt Resharper : với con trỏ trên lớp / giao diện, nhấp chuột phải - Kiểm tra - Phân cấp

Điều này cho thấy các lớp con, triển khai và siêu lớp.


Hmmm ... thú vị, nhưng không phải những gì tôi đang tìm kiếm. Nếu tôi nhấp chuột phải vào một mục ActionResult được trả lại và làm theo các bước sau, tôi sẽ nhận được các tùy chọn 'Kiểm tra' cho 'Trình điều khiển' (loại của lớp chứa). Nếu tôi cố gắng đi đến định nghĩa 'ViewResult', tôi đang ở trong siêu dữ liệu và tôi không có tùy chọn Kiểm tra phân cấp.
Dan Esparza

1
Ngoài ra: Tôi khá chắc chắn đây là một chức năng được cung cấp bởi Resharper, nó không thực sự có trong Visual Studio ...
Dan Esparza

7

Dùng thử Visual Studio Class View

Trong Visual Studio Class View, điều hướng đến lớp bạn quan tâm và tìm các lớp cơ sở và lớp dẫn xuất của nó


3
Đây thực sự là một quan điểm hữu ích. Đáng buồn thay, nó cực kỳ chậm, không liên kết / theo trình soạn thảo hiện tại và thường cảm thấy như một suy nghĩ lại trong VS.
E-Riz

Điều này cho thấy tất cả các lớp, không chỉ các lớp trong giải pháp của bạn và hoạt động ngay lập tức. Nó không chậm. Để có chế độ xem giống đồ thị hơn, hãy sử dụng tính năng tích hợp Biểu đồ lớp (nhưng chỉ hiển thị các lớp trong giải pháp của bạn). Đây là tất cả những gì tôi cần và đây là câu trả lời tốt nhất.
Nikos

5

Bạn cũng có thể sử dụng Reflector .

Tải tất cả các cụm mà bạn muốn nó nhìn vào, điều hướng đến một loại và mở rộng mục Loại đã tạo.

Bạn cũng có thể làm điều này trong Trình duyệt đối tượng, nhưng vì một số lý do, VS2008 chỉ có thể thực hiện điều đó trong một trong các chế độ xem .Net Framework. (VS2010 Beta 2 có thể làm điều đó trong bất kỳ chế độ xem nào)


3
Reflector hiện tốn tiền, nhưng ILSpy sẽ làm tương tự miễn phí.
yoyo

Có bản dùng thử miễn phí 30 ngày, nhưng không có phiên bản miễn phí nào bạn có thể sử dụng vô thời hạn. Trừ khi bạn biết điều gì đó tôi không biết? Tôi đã chỉ kiểm tra Reflector.net .
yoyo

1
Lấy làm tiếc; Reflector sử dụng để vẫn có một phiên bản miễn phí. Khi nào họ thoát khỏi nó?
SLaks

Ngày 2 tháng 2 năm 2011 - zdnet.com/blog/burnette/ từ
yoyo

3
Điều thực sự khủng khiếp là sau ngày đó, nếu bạn chạy một bản sao của phiên bản miễn phí mà bạn đã tải xuống trước đó, hãy chuyển lại (họ đã mua Reflector) XÓA phiên bản miễn phí cũ, thay thế bằng bản dùng thử. Không có bất kỳ cảnh báo. Và không có tùy chọn để tránh "nâng cấp". Đúng vậy: Tôi đã không truy cập trang web của công ty và tải xuống bất cứ thứ gì từ họ. Nhưng có logic cấp phép trong ReSharper cũ đã được chuyển hướng đến họ và cho phép họ hủy kích hoạt bản sao tôi có. Tôi thề sẽ không bao giờ, trong mọi trường hợp, mua bất cứ thứ gì từ redgate, hoặc nếu không thì khuyến khích sự tồn tại của họ.
ToolmakerSteve

4

Đối với các lớp Framework, tôi sử dụng Thư viện MSDN. Phần Phân cấp kế thừa đi theo cả hai hướng. Tuy nhiên, phải thừa nhận rằng không có nhiều trợ giúp cho một số thư viện bên 3d.


Dưới đây là một ví dụ cho System.Exception: msdn.microsoft.com/en-us/l
Library / 2007

4

Với sự trợ giúp của ReSharper (phiên bản 2016.1.2), chỉ cần Ctrl+ Alt+ Clicktrên Lớp cơ sở. Bạn sẽ thấy một cái gì đó như thế này:

xem các lớp dẫn xuất reSharper


1
+1 Tốt đẹp! Vì vậy, có vẻ như các tên lớp xuất hiện in đậm trong danh sách được kế thừa trực tiếp từ lớp cơ sở đã chọn và các tên lớp trong danh sách không in đậm được gián tiếp kế thừa từ lớp cơ sở được chọn?
Simon Bosley

Chính xác. Hói sẽ là lớp kế thừa trực tiếp.
Devid


1

chọn loại và nhấp chuột phải để xem một cái gì đó --- hiển thị trên bản đồ mã --option chọn nó tạo ra định dạng hình ảnh cho những người kế thừa loại hình này rất đẹp như định dạng tệp .dgml, nó cung cấp nhiều thông tin hơn về loại


1

Là một tùy chọn cho những người sử dụng Visual Assistant, bạn cũng có thể nhấn Shift + ALT + G (trong khi dấu mũ có tên lớp) để hiển thị menu ngữ cảnh "Liên quan đến Goto" và nếu có các lớp dẫn xuất, bạn sẽ nhận được menu con cho rằng liệt kê tất cả chúng ra và thậm chí hiển thị các cấu trúc thừa kế trong số các lớp dẫn xuất đó.


0

Chỉ cần mã 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
Thật không may, điều này chỉ cho bạn biết các kiểu kế thừa trực tiếp từ một lớp cụ thể, chứ không phải các kiểu được gián tiếp kế thừa từ một lớp. Cho rằng bạn có thể phải sử dụng một cái gì đó giống như những gì MZN đã viết.
user420667

Hoặc bạn có thể sử dụng t.IsSubClassOf (lớp đích).
user420667

0

nếu bạn đã nâng cấp lên VS2012, bạn có thể sử dụng "Bản đồ mã".
Nhấp chuột phải vào loại bạn muốn xem cấu trúc phân cấp thừa kế và chọn "Thêm vào bản đồ mã". Sau đó, trong chế độ xem bản đồ mã, bạn có thể mở rộng các nút và nhấp chuột phải để chọn "Hiển thị các lớp gốc / cơ sở". Thật không may, nó không hoạt động cho các lớp được cung cấp .NET.


4
FYI cho bất kỳ ai khác, điều này chỉ áp dụng cho VS2012 Ultimate với bản cập nhật 1 được cài đặt. Thật không may, những người cao cấp / Pro không thể tạo ra những bản đồ này.
Sean Hanley

0

Dành cho Visual Studio 2012 ( Không có ReSharper )

  1. Trong Solution Explorer, nhấp chuột phải vào lớp (có các lớp dẫn xuất mà bạn muốn xem).
  2. Trong sơ đồ lớp, nhấp chuột phải vào lớp và chọn 'Hiển thị các lớp dẫn xuất'.

1
Một lần nữa, theo như tôi có thể nói điều này sẽ chỉ hiển thị các lớp dẫn xuất mà bạn đã viết. Làm thế nào điều này sẽ làm việc với ví dụ nêu trong câu hỏi ban đầu? (Các loại ActionResult)
Dan Esparza

0

Cập nhật năm 2020:

Bạn có thể sử dụng Bản đồ mã của Visual Studio hoạt động khá tốt.

Chỉ cần nhấp chuột phải vào lớp và điều hướng tới:
Code Map> Show Related Items on Code Map>Show All Derived Types

nhập mô tả hình ảnh ở đây

Ghi chú:

  • Tính năng này chỉ khả dụng trên phiên bản Enterprise của Visual Studio và nếu bạn không có , bạn có thể tải xuống miễn phí bằng cách tải xuống phiên bản Enterprise Preview từ đây .
  • Hoặc bạn chỉ có thể hỏi bất cứ ai từ đội chia sẻ của bạn bản đồ mã với này tính năng nếu họ có phiên bản đó.

PS Thật sự đáng để giữ phiên bản Enterprise (hoặc ít nhất là phiên bản Preview của nó) trong máy của bạn, vì nó có rất nhiều công cụ thực sự hữu ích không có trong các phiên bản khác.


1
Có vẻ như điều này chỉ hoạt động cho các loại bạn có nguồn cho. Không phải những thứ như ActionResult(ví dụ của OP)
Iain

-1

Một cách rất đơn giản để thực hiện việc này là tìm kiếm : Classnametrong "Cửa sổ Tìm và Thay thế" (CTRL + F) và sử dụng Tùy chọn "Tìm Tùy chọn / Ghép toàn bộ từ". Bạn sẽ chỉ tìm thấy các lớp kế thừa.


1
Điều này không hoạt động mọi lúc, hãy xem xétclass DDerived : IInterface, BBase
jirkamat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.