2010-08-25 28 views
5

Gần đây tôi đã được giao nhiệm vụ thêm câu lệnh ghi nhật ký vào mọi lời gọi phương thức trong một giải pháp. Các mục nhật ký này cần chứa tên lớp và phương thức.Đang đăng nhập C#: Nhận hiệu suất tên lớp/phương thức

Tôi biết tôi có thể sử dụng các phương thức MethodBase.GetCurrentMethod()StackFrame.GetMethod(). Cái nào tốt hơn? Có cách nào tốt hơn (hoặc nhiều hơn) để có được tên lớp và phương thức?

+5

* Mọi phương pháp *? Có những cách dễ dàng hơn để làm cho ứng dụng của bạn chậm hơn mười nghìn lần hoặc tạo ra một gigabyte văn bản một phút. –

+3

Rất nhiều trong cuộc sống của tôi chỉ là làm những gì khách hàng hỏi. –

+0

có một nơi trong mối quan hệ tư vấn cho những lời chỉ trích xây dựng và, trên thực tế, đó là một phần quan trọng của công việc. Tôi đã làm việc trên các dự án đã có loại đăng nhập phổ biến và nó thường dẫn đến việc mọi người bỏ qua các bản ghi trừ khi họ hoàn toàn phải mất vài giờ nó sẽ yêu cầu đào sâu chúng. –

Trả lời

5

Tôi có hai gợi ý:

  1. Sử dụng khung làm sẵn AOP (như http://www.sharpcrafters.com/) họ có thể xử lý việc này một cách dễ dàng
  2. Làm một hành động tùy chỉnh prebuild nơi bạn thay thế một số loại còn sơ khai vào đầu mọi phương pháp:

    trống PerformSomeAction() { // PUT_LOGGING_HERE }

khi đó, trong công cụ tùy chỉnh, hãy thay thế các tên gốc đó bằng tên phương thức. Điều này được đảm bảo phương pháp nhanh nhất, nhưng yêu cầu một số khoản đầu tư.

+0

+1, Đây là loại kịch bản mà AOP được tạo ra. –

+0

Tôi có thể đưa ra gợi ý đó không. Không phải đó không phải là một điểm tuyệt vời. –

1

this.getType().toString() nên giúp bạn có được lớp

Về phương pháp này có vẻ như StackFrame và methodbase là obvouis nhất các giải pháp, tôi không thể nhận xét về đó là hiệu quả hơn.

+1

trừ trường hợp này là C#, không phải Java, nhưng bạn nói chung là đúng – Andrey

+0

Nếu nó là this.GetType(). ToString()? hoặc tôi thiếu một cái gì đó khác – Raynos

+0

Object.ToString() sẽ trả về tên lớp trừ khi ToString() bị ghi đè. – Nate

2

Vâng, cách tốt nhất/nhanh nhất là bao gồm chuỗi trong mọi chức năng. Điều đó có thể không xuất hiện giải pháp thực tế nhất, nhưng MethodBase.GetCurrentMethod() yêu cầu mã hóa bên trong mọi phương thức sử dụng nó. tức là Bạn có thể viết

string funcName = "MyClass.MyFunction(int, int)"; 

hoặc bạn có thể viết

string funcName = MethodBase.GetCurrentMethod().Name 

Bây giờ, nếu bạn muốn để có được tên của hàm mà gọi chức năng hiện tại (ví dụ, bạn muốn làm điều này trong một vị trí trong hàm ghi nhật ký của bạn), sau đó tùy chọn duy nhất của bạn đang đọc qua StackFrame.

+0

Nếu tôi nhớ lại đúng, MethodBase.GetCurrentMethod() cũng có thể trả về các kết quả khác nhau dựa trên bất kỳ nội tuyến/tối ưu hóa nào được thực hiện bởi trình biên dịch, vì vậy các tên hàm hardcoding có thể đáng tin cậy hơn theo nghĩa đó. –

+0

bạn có thể tự động hóa bao gồm tên hàm dưới dạng chuỗi tại quá trình xây dựng – Andrey

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