2009-12-29 44 views
5

Tôi đã kéo tóc ra để cố gắng giải quyết vấn đề này. Những gì tôi đang cố gắng làm là xây dựng một 'bản đồ' về cách các đối tượng đang được sử dụng trong một chút mã mà tôi đang làm việc. Hãy suy nghĩ về nó như là một nâng cao Tìm Usages. Cách dễ nhất để hiển thị này là bằng ví dụ:.NET Reflection: Tìm các loại đã sử dụng

public class MasterClass 
{ 
    Type1 type1; 
    Type2 type2; 
    Type3 type3; 
    void InitializeData() 
    { 
     type1 = new Type1(this); 
     type2 = new Type2(this); 
     type3 = new Type3(this); 
    } 
} 

public class Type1 
{ 
    private MasterClass _master; 
    public Type1(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type2 and _master.type3 here 
    } 
} 

public class Type2 
{ 
    private MasterClass _master; 
    public Type2(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type3 here 
    } 
} 

public class Type3 
{ 
    private MasterClass _master; 
    public Type3(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type1 and _master.type2 here 
    } 
} 

Những gì tôi đang cố gắng làm là có được một bản đồ hoặc báo cáo rằng, trong trường hợp của ví dụ, sẽ cung cấp cho một cái gì đó như:

Type1 sử dụng bởi: { Type3}

Type2 sử dụng bởi: {type1, Type3}

Type3 sử dụng bởi: {type1, Type2}

Nếu tôi có thể làm cho nó vào một cuốn từ điển thì tôi về nhà. :-)

Những gì tôi đã cố gắng:

Tôi đã thử đi qua các hội đồng, từng loại, mỗi phương pháp sau đó kéo các mảng IL và sau đó cố gắng để phân tích các toán hạng không có may mắn. Tôi thậm chí đã cố gắng đi qua các tập tin nguồn với một số biểu thức thông thường nhưng tôi có hàng ngàn lớp học để đi qua, viết bằng nhiều phong cách khác nhau có nghĩa là tôi sẽ bỏ lỡ một số tài liệu tham khảo.

Tôi có thể sử dụng Reflector & &/|| Resharper để có được một tham chiếu tại một thời điểm nhưng tôi muốn nhận được tất cả cùng một lúc.

Mọi đề xuất?

+0

một Reflector có add-in mà không được công việc, đảm bảo đầy đủ? – driis

+0

Bạn có muốn đạt được điều này một cách có lập trình hoặc chỉ sử dụng một công cụ không? – Ucodia

+0

C# là ngôn ngữ lập trình. Nó không có Reflection. Đó là .NET. –

Trả lời

3

Thật không dễ dàng. Bạn sẽ có để có được một thể hiện của MethodInfo, PropertyInfo, FieldInfo, vv cho tất cả các nội dung sau:

  • phương pháp
  • loại
  • tài sản (get và set)
  • sự kiện (thêm và loại bỏ)

Sau đó, bạn sẽ cần phân tích cú pháp IL và gọi đối tượng ResolveMethod trên cá thể Mô-đun mà loại đang được kiểm tra và xem xem thể hiện có tương ứng với MethodInfo hay không cho phương pháp của bạn mà bạn đang cố gắng xác định việc sử dụng.

EDIT:

Giống như "Tìm Mọi Tham khảo" trong Visual Studio, điều này chỉ sẽ tìm tài liệu tham khảo trực tiếp. Nếu bạn cũng muốn tìm các tham chiếu gián tiếp (ví dụ: phương thức tham chiếu phương thức 1 và phương thức tham chiếu method2 - bạn muốn thấy có kết nối từ phương thức1 đến phương thức 3), bạn sẽ cần thực hiện điều này bằng đệ quy.

7

Tôi đề nghị sử dụng NDepend vì điều này, vì nó được thiết kế riêng cho vấn đề bạn đang mô tả. Làm điều này trong mã sẽ có khá nhiều công việc.

+0

Theo đề xuất của bạn, tôi đã tải xuống đường dẫn NDepend và đã chơi với nó nhưng tôi không tìm thấy cách nào để tạo báo cáo tôi cần. Tôi có thể phải chơi với nó một số chi tiết. –

+0

Ma trận phụ thuộc không phù hợp với nhu cầu của bạn? Hay nó không đi vào chi tiết bạn cần? – user7116

+0

Với hàng trăm lớp trong một không gian tên và tham chiếu đến các đối tượng trong không gian tên anh chị em, không phải ma trận cũng như đồ thị là rất có thể sử dụng được. Một trong những không gian tên nhỏ hơn mà tôi phải đối phó với việc tạo ra một ma trận là 640 x 640. Để bao gồm tất cả các đối tượng tôi sẽ xem xét một ma trận 4300+ x 4300+. Thêm vào đây là một thực tế là các đường mòn không cho phép bạn phóng to. Vì vậy, đối với đồ thị tôi thấy một đốm màu lớn, nơi tôi không thể nhận được xuống đến các lớp học cá nhân. :-( Nhưng một lần nữa tôi không có nhiều thời gian để xem nó –

0

Nếu bạn chỉ đang tìm kiếm một công cụ, Trình phản xạ có thể thực hiện với một số bổ trợ.

Ở đây bạn sẽ tìm thấy một loạt các add-ins: http://reflectoraddins.codeplex.com/

Một số plugin như FileGenerator có thể sao chép ra Reflector trực tiếp vào một tập tin.

Các vấn đề liên quan