2009-01-07 21 views

Trả lời

0

Xem câu hỏi này:
Can you use reflection to find the name of the currently executing method?

Nó không phải là một bản sao, nhưng câu trả lời cho câu hỏi đó sẽ trả lời bạn là tốt.

+1

Không thực sự - bởi vì trong khi nó khả thi để có được phương pháp gọi điện thoại, điều đó không cho bạn biết loại thực tế của đối tượng thực hiện cuộc gọi. Ví dụ, nó có thể là trong BaseClass.Foo() nhưng từ một thể hiện của DerivedClass mà thực hiện một giao diện mà Andrew đang tìm kiếm. –

+0

Nó cung cấp cho bạn một dấu vết ngăn xếp, mặc dù. –

+1

Có, nhưng cách tôi đọc câu hỏi chưa đủ. –

18

Không, không có - ít nhất là không sử dụng API lược tả/gỡ lỗi của một số mô tả. Bạn có thể đi bộ ngăn xếp để tìm phương thức gọi, với thông báo trước rằng nó rất chậm và có thể không chính xác do tối ưu hóa JIT. Điều đó sẽ không cho bạn biết đối tượng gọi là gì (nếu thực sự có một).

+0

Aaaah - vì vậy có lẽ VS thực hiện nó theo một cách phức tạp nào đó bằng cách thiết lập mã? –

+0

Vâng, không phải bằng cách thiết lập mã quá nhiều như chạy các API trình gỡ rối cung cấp tất cả các loại thông tin - với mức giá, tất nhiên. –

+2

Oooh - nơi tôi có thể tìm thấy thông tin moer trên các API trình gỡ lỗi này? –

2

Nếu bạn muốn để có được những loại bạn có thể thử này:.

mới StackFrame (1) .GetMethod() DeclaringType

Như Jon chỉ ra có thể có vấn đề nếu bạn chạy vào optimisizations JIT.

Để nhận dữ liệu từ đối tượng, tôi không nghĩ là có thể.

Sửa

Chỉ cần để xây dựng về vấn đề tối ưu hóa, lấy đoạn mã sau:

class stackTest 
    { 
     public void Test() 
     { 
      StackFrame sFrame = new StackFrame(1); 
      if (sFrame == null) 
      { 
       Console.WriteLine("sFrame is null"); 
       return; 
      } 

      var method = sFrame.GetMethod(); 

      if (method == null) 
      { 
       Console.WriteLine("method is null"); 
       return; 
      } 
      Type declaringType = method.DeclaringType; 
      Console.WriteLine(declaringType.Name); 
     } 

     public void Test2() 
     { 
      Console.WriteLine(new StackFrame(1).GetMethod().DeclaringType.Name); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      stackTest s = new stackTest(); 
      s.Test(); 
      Console.WriteLine("Doing Test2"); 
      s.Test2(); 
      Console.ReadLine(); 

     } 
    } 

Chúng tôi sẽ nhận được chương trình với giao diện điều khiển hai lần, và khi bạn chạy trong trình gỡ lỗi bạn làm. Khi bạn chạy mà không có trình gỡ lỗi trong chế độ phát hành, bạn sẽ nhận được kết quả đầu ra từ hàm Kiểm tra đầu tiên. Đó là bằng cách xác thực bởi vì nó phức tạp để được inlined; tuy nhiên, phương thức thứ hai gây ra một ngoại lệ tham chiếu null.

Một mối nguy hiểm khác với mã này là tại MS cải thiện trình biên dịch JIT, những gì có thể đã hoạt động trong 2.0 có thể bị lỗi và ghi trong các phiên bản sau.

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