2012-06-13 30 views

Trả lời

6

phải nhấp chuột vào một phương pháp bất cứ nơi nào trong giao diện người dùng, và chọn menu: Chọn Phương pháp ...> ... đang sử dụng tôi (trực tiếp hoặc gián tiếp) dẫn đến một truy vấn mã như:

from m in Methods 
let depth0 = m.DepthOfIsUsing("NUnit.Core.NUnitFramework+Assert.GetAssertCount()") 
where depth0 >= 0 orderby depth0 
select new { m, depth0 } 

Vấn đề là truy vấn đó cho phép sử dụng gián tiếp, nhưng không tìm kiếm các cuộc gọi xảy ra qua giao diện (hoặc phương thức ghi đè được khai báo trong lớp cơ sở).

Hy vọng rằng những gì bạn đang yêu cầu có thể thu được với truy vấn này:

// Retrieve the target method by name 
let methodTarget = Methods.WithFullName("NUnit.Core.NUnitFramework+Assert.GetAssertCount()").Single() 

// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect 
// call of the target method. 
let indirectCallDepth = 
    methodTarget.ToEnumerable() 
    .FillIterative(
     methods => methods.SelectMany(
      m => m.MethodsCallingMe.Union(m.OverriddensBase))) 

from m in indirectCallDepth.DefinitionDomain 
select new { m, callDepth = indirectCallDepth[m] } 

Hai đá góc của truy vấn này là:

  • Các cuộc gọi đến FillIterative() để chọn đệ quy cuộc gọi gián tiếp.
  • Cuộc gọi đến bất động sản IMethod.OverriddensBase, như tên gọi của nó. Đối với phương thức M, điều này trả về số đếm của tất cả các phương thức được khai báo trong một lớp cơ sở hoặc một giao diện, được ghi đè bởi M.
+1

Có thể tạo biểu đồ từ kết quả của truy vấn này không? các vấn đề mà tôi nhận được là tập quán thông qua ghi đè không được hiển thị ... – ironic

+1

không cho bây giờ cạnh trên đồ thị chỉ hiển thị "phụ thuộc" thực sự, tình trạng này sẽ phát triển –

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