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.
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. –
Nó cung cấp cho bạn một dấu vết ngăn xếp, mặc dù. –
Có, nhưng cách tôi đọc câu hỏi chưa đủ. –