2013-02-13 49 views
22

Tôi hiện đang phát triển một thư viện đăng nhập ứng dụng bằng cách sử dụng TraceListener tích hợp sẵn. Thư viện này sẽ được sử dụng trong nhiều dự án và nên cung cấp một giao diện đơn giản, nơi tôi chỉ phải quan tâm đến những gì sẽ được ghi vào trong tệp nhật ký, nhưng không phải là CÁCH.Cách xác định phương thức gọi và tên lớp?

Bằng cách sử dụng không gian tên phản chiếu, tôi có thể tìm ra ứng dụng nào được gọi là hàm nhật ký (truy xuất tên lắp ráp thực thi), nhưng tôi cũng muốn tên của hàm và lớp được gọi là hàm ghi nhật ký.

Hãy nói rằng tôi có:

public static void LogInfo(string vLogText) { 
    Trace.WriteLine(
     MethodInfo.GetCurrentMethod().Name 
     + this.GetType().ToString() + vLogText); 
    } 

Khi tôi gọi từ một dự án khác (lớp: TestClass, phương pháp: TestMethod)

Tracer.LogInfo("log this!") 

tôi mong đợi để xem trong nhật ký:

TestClass, TestMethod, log this! 

Nhưng thay vào đó tôi nhận được

TracerClass, LogInfo, log this! 

Làm cách nào để có được phương thức gốc và tên lớp?

+5

[Điều này có thể giúp bạn vô cùng] (http://msdn.microsoft.com/en-us/library/hh534540.aspx) nếu bạn đang sử dụng C# và VS mới nhất 2012. –

+0

@ Trustme-I'maDoctor thật tuyệt vời! Đã không nhận thức được một điều như vậy. Bạn có thể làm điều này cho một câu trả lời thay vì nhận xét để tôi có thể bỏ phiếu và đánh dấu nó là đã đóng không? Cảm ơn nhiều. – Neurodefekt

+0

@Neurodefekt Không sao cả. Mừng vì tôi có thể giúp. :) –

Trả lời

27

C# và VS 2012 mới nhất được giao với Caller Information (cụ thể là CallerFilePathAttribute, CallerLineNumberAttributeCallerMemberNameAttribute), sẽ giúp bạn nếu bạn chỉ có thể sử dụng.

Nếu không thể, bạn phải tham khảo các câu trả lời khác.

+1

Điều này có vẻ như một câu trả lời tuyệt vời cho tôi tôi luôn ngần ngại truy cập stackTrace cho mục đích đó. Một câu hỏi mặc dù nó có vẻ như bộ xử lý biên dịch trước và sẽ được thay thế bằng tên người gọi thực sự trong mã IL. vì vậy tôi đã nghĩ rằng tôi sẽ không được an toàn nếu ai đó thích obfuscate mã IL. bất kỳ ý kiến ​​về điều đó? –

+1

@MubasharAhmad Từ [tài liệu] (https://msdn.microsoft.com/en-us/library/mt653988.aspx): "Giá trị Thông tin Người gọi được phát ra dưới dạng chữ vào Ngôn ngữ Trung gian (IL) tại thời gian biên dịch. kết quả của thuộc tính StackTrace đối với trường hợp ngoại lệ, kết quả không bị ảnh hưởng bởi sự che khuất. " –

16

Hãy thử làm một cái gì đó như thế này:

var mth = new StackTrace().GetFrame(1).GetMethod(); 
var cls = mth.ReflectedType.Name; 
// where 1 illustrates how deep into the stack to reflect. 

Có nhiều giải pháp thanh lịch hơn trong C# 5.0>, tuy nhiên nếu bạn đang sử dụng các khuôn khổ cũ, bên trên sẽ giúp đỡ.

+13

Hai điều: 1) Điều này có thể ảnh hưởng đáng kể đến hiệu suất 2) Trong mã tối ưu, phương thức nội tuyến có thể khiến tên phương thức không chính xác được in. –

2

Bạn chỉ có thể ghi lại dấu vết ngăn xếp đầy đủ thay vì chỉ gọi phương thức sử dụng Environment.StackTrace. Điều này có thể giúp bạn nếu bạn muốn sử dụng cấu trúc đăng nhập giống nhau để ghi lại các ngoại lệ.

Tham khảo this msdn page để biết thêm thông tin.

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