2009-02-16 31 views

Trả lời

20
Console.WriteLine(new StackFrame().GetMethod().DeclaringType); 
+4

Như được chỉ ra bởi @Jamezor, đây có thể là một cơn ác mộng về hiệu suất. cổ vũ – systemkern

11

Trong khi các câu trả lời của StackTrace là chính xác, chúng có phí. Nếu bạn chỉ muốn an toàn để thay đổi tên, hãy xem xét typeof(foo).Name. Vì các phương thức tĩnh không thể ảo, điều này thường là tốt.

+0

Đó là một điểm tốt. Rõ ràng nếu bạn kiểm soát phương pháp thì bạn kiểm soát tên lớp, do đó, toàn bộ điều là một chút học tập. –

+0

Tất cả những gì tôi sử dụng là để ghi lại hành vi ngoại lệ, vì vậy tôi có thể sống với chi phí sử dụng phương pháp Stack Trace khi thực thi (có thể) ngừng sau hoạt động ghi nhật ký này. –

+0

cái này sẽ không hoạt động nếu mã được dán vào một lớp khác và bạn quên rằng bạn có mã này –

6

A (sạch, IMO) thay thế (vẫn chậm như địa ngục và tôi sẽ co rúm người lại nếu tôi thấy điều này trong một cơ sở mã sản xuất):

Bằng cách này, nếu bạn đang làm điều này cho khai thác gỗ , một số khung công tác ghi nhật ký (chẳng hạn như log4net) có khả năng được tích hợp. Và có, chúng cảnh báo bạn trong tài liệu rằng đó là một cơn ác mộng về hiệu suất tiềm năng.

-3

Vì phương thức tĩnh không thể kế thừa tên lớp sẽ được bạn biết khi bạn viết phương thức. Tại sao không chỉ hardcode nó?

+0

phương pháp tĩnh có thể được thừa hưởng khó khăn., Và nếu bạn muốn gọi phương thức tĩnh của subclasse bạn sẽ được ra khỏi may mắn – systemkern

+1

@systemkern - Xin lỗi, tôi không hiểu điều đó. Thậm chí nếu bạn gọi phương thức "thông qua" một lớp con (như 'SubClass.BaseClassStaticMethod();'), mã IL thực tế vẫn sẽ giống như bạn gọi nó từ lớp cơ sở. Nó chỉ là một cú pháp của trình biên dịch C#.Không có cách nào để _actually_ gọi một phương thức "thông qua một phân lớp", và do đó không có cách nào từ bên trong phương thức để tìm ra rằng mã C# gọi được viết như thế. –

+0

Có đó là sự thật nhưng điều đó có thể được chính xác điểm bạn có thể muốn có hành vi hơi khác nếu bạn gọi SubClassAA.BaseClassStaticMethod() hơn nếu bạn gọi SubClassBB.BaseClassStaticMethod(). này có thể không đẹp, nhưng đôi khi cần thiết bởi vì bạn không có toàn quyền kiểm soát các Subclass ... vì "lý do" – systemkern

44

Bạn có ba tùy chọn để có được các loại (và do đó tên) của YourClass mà làm việc trong một chức năng tĩnh:

  1. typeof(YourClass) - nhanh (0,043 micro)

  2. MethodBase.GetCurrentMethod().DeclaringType - chậm (2,3 micro giây)

  3. new StackFrame().GetMethod().DeclaringType - chậm nhất (17,2 micro giây)


Nếu sử dụng typeof(YourClass) là không mong muốn, thì MethodBase.GetCurrentMethod().DeclaringType chắc chắn là lựa chọn tốt nhất.

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