2013-02-13 15 views
22

मैं वर्तमान में ट्रेस लिस्टनर में निर्मित अनुप्रयोग लॉगिंग लाइब्रेरी विकसित कर रहा हूं। इस पुस्तकालय का उपयोग कई परियोजनाओं में किया जाएगा और एक साधारण इंटरफ़ेस प्रदान करना चाहिए जहां मुझे केवल लॉग फ़ाइल में क्या लिखा जा रहा है, लेकिन क्यों नहीं।कॉलिंग विधि और कक्षा का नाम कैसे निर्धारित करें?

प्रतिबिंब नामस्थान का उपयोग करके, मैं यह पता लगा सकता हूं कि वर्तमान में कौन से एप्लिकेशन को लॉग फ़ंक्शन (निष्पादन असेंबली नाम पुनर्प्राप्त करना) कहा जाता है, लेकिन मैं फ़ंक्शन और क्लास का नाम भी चाहता हूं जिसे लॉगिंग फ़ंक्शन कहा जाता है।

चलो कहते हैं कि मेरे पास दो:

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

जब मैं एक अन्य परियोजना से कॉल (वर्ग: TestClass, विधि: TestMethod)

Tracer.LogInfo("log this!") 

मैं लॉग में देखने की उम्मीद:

TestClass, TestMethod, log this! 

लेकिन इसके बजाय मुझे

मिला
TracerClass, LogInfo, log this! 

मूल विधि और कक्षा का नाम कैसे प्राप्त करें?

+5

[यह आपको बहुत मदद कर सकता है] (http://msdn.microsoft.com/en-us/library/hh534540.aspx) यदि आप नवीनतम सी # और वीएस 2012 का उपयोग कर रहे हैं। –

+0

@ ट्रस्टमे-इमाडॉक्टर शानदार है! ऐसी चीज से अवगत नहीं था। क्या आप इसे टिप्पणी के बजाय उत्तर में बना सकते हैं ताकि मैं वोट कर सकूं और इसे बंद कर सकूं? आपका बहुत बहुत धन्यवाद। – Neurodefekt

+0

@Neurodefekt कोई समस्या नहीं, यह हो गया है। मैं खुशी से मदद कर सकता है। :) –

उत्तर

27

नवीनतम सी # और वी.एस. 2012 Caller Information (अर्थात् CallerFilePathAttribute, CallerLineNumberAttribute और CallerMemberNameAttribute) है, जो आपकी मदद करेगा अगर आप केवल उपयोग कर सकते हैं के साथ भेज दिया।

यदि आप नहीं कर सकते हैं, तो आपको अन्य उत्तरों का संदर्भ देना होगा।

+1

यह मेरे लिए एक महान जवाब की तरह लगता है मैं हमेशा इस उद्देश्य के लिए stackTrace तक पहुंचने में संकोच करता हूं। एक सवाल हालांकि यह पूर्व संकलन प्रोसेसर की तरह लगता है और आईएल कोड के भीतर वास्तविक कॉलर नाम से प्रतिस्थापित किया जाएगा। इसलिए मैं सोच रहा था कि अगर कोई आईएल कोड को खराब करना पसंद करता है तो मैं सुरक्षित नहीं होगा। उस पर कोई टिप्पणी? –

+1

@ मुबारर अहमद [प्रलेखन] (https://msdn.microsoft.com/en-us/library/mt653988.aspx) से: "कॉलर जानकारी मान इंटरमीडिएट भाषा (आईएल) में संकलन समय पर अक्षर के रूप में उत्सर्जित होते हैं। अपवादों के लिए स्टैकट्रेस संपत्ति के परिणाम, परिणाम obfuscation से प्रभावित नहीं हैं। " –

16

कुछ इस तरह कर रही प्रयास करें:

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

सी # 5.0 में और अधिक सुरुचिपूर्ण समाधान> रहे हैं, लेकिन यदि आप पुराने चौखटे का उपयोग कर रहे हैं, इसके बाद के संस्करण में मदद मिलेगी।

+13

दो चीजें: 1) यह प्रदर्शन को काफी प्रभावित कर सकता है 2) अनुकूलित कोड में, विधि इनलाइनिंग गलत विधि नाम मुद्रित करने का कारण बन सकती है। –

2

आप Environment.StackTrace का उपयोग कर केवल कॉलिंग विधि के बजाय पूर्ण स्टैक ट्रेस रिकॉर्ड कर सकते हैं। अगर आप अपवाद लॉग इन करने के लिए एक ही लॉगिंग संरचना का उपयोग करना चाहते हैं तो यह आपकी मदद कर सकता है।

अधिक जानकारी के लिए this msdn page का संदर्भ लें।

संबंधित मुद्दे