Khi sử dụng sự phản chiếu, có thể nhận được ngăn xếp cuộc gọi (ngoài ra nó có thể là một xấp xỉ thô do tối ưu hóa JIT) bằng cách sử dụng System.Diagnostics.StackTrace và kiểm tra các đối tượng StackFrame chứa.Làm thế nào để có được đối tượng thực hiện cho một stackframe?
Làm cách nào tôi có thể tham chiếu đến đối tượng (con trỏ này) mà phương thức trong khung ngăn xếp đang thực thi?
Tôi biết tôi có thể lấy MethodBase bằng cách gọi GetMethod() trên đối tượng khung ngăn xếp, nhưng những gì tôi đang tìm là một cái gì đó dọc theo dòng GetObject() (tự nhiên trả về null nếu phương thức là tĩnh). Dường như đối tượng khung ngăn xếp chỉ có thể được truy vấn cho thông tin được xác định tĩnh như thông tin phương pháp, tệp gốc, v.v.
Trình gỡ lỗi VS biết (mặc dù nó có thể sử dụng phương pháp khác để nhận dấu vết cuộc gọi), vì có thể nhấp đúp vào bất kỳ khung ngăn xếp nào trong cửa sổ ngăn xếp cuộc gọi và xem xét các giá trị của các trường địa phương và lớp.
EDIT: Để làm rõ: Tôi muốn đối tượng dụ trên mà phương pháp này được gọi. Tức là: Nếu phương thức Foo() được gọi trên cá thể đối tượng A ở đâu đó trên ngăn xếp cuộc gọi, và nó xếp vào phương thức tôi thực hiện theo dõi ngăn xếp, tôi muốn lấy tham chiếu đến A từ nơi tôi thực hiện theo dõi ngăn xếp. (Không phải là kiểu tuyên bố của các cơ sở phương pháp)
Tôi biết rằng con trỏ này được chuyển đến được gọi là phương thức trên ngăn xếp cuộc gọi bởi người gọi, đó là lý do tại sao GetObject không tồn tại() sẽ trả về null nếu nó là một phương thức tĩnh và một bản sao của con trỏ 'this' chuẩn trong một phương thức instance. Tuy nhiên, tôi đồng ý với đối số số 1 của bạn, ngoại trừ việc quyền truy cập vào đối tượng có thể dễ dàng bị hạn chế bằng cách yêu cầu sự cho phép thích hợp theo thiết kế. –
Vấn đề thực sự là một StackFrame chỉ là một số siêu dữ liệu về mã của bạn, nó không phải là một phiên bản trực tiếp của mã của bạn. – Yona
Như tôi lo sợ. Nhưng tôi hy vọng có một số lớp khác để tận dụng. –