2016-06-29 17 views
19

ब्राउज़ किया गया है, खोजा गया है और उम्मीद है लेकिन सीधे जवाब नहीं मिल सकता है।वर्तमान विधि का नाम पाने के लिए नाम का उपयोग

विधि का नाम निर्दिष्ट withouth nameof का उपयोग कर वर्तमान पद्धति नाम पाने के लिए सी # 6.0 में वैसे भी वहाँ है?

मैं इस तरह एक शब्दकोश में मेरी परीक्षा परिणाम द्वारा जोड़ा जा रहा:

Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result); 

मैं अगर मैं तो मैं कॉपी कर सकते हैं + लाइन पेस्ट स्पष्ट रूप से विधि नाम निर्दिष्ट करने की जरूरत नहीं होगी पसंद करते हैं, एक गैर कामकाजी उदाहरण:

Results.Add(nameof(this.GetExecutingMethod()), result); 

यदि संभव हो तो मैं प्रतिबिंब का उपयोग नहीं करना चाहता।

अद्यतन

यह (के रूप में सुझाव दिया) नहीं है this question का डुप्लिकेट। मैं पूछ रहा हूं कि वर्तमान विधि नाम प्राप्त करने के लिए nameof के बिना (!) प्रतिबिंब के उपयोग के लिए स्पष्ट रूप से संभव है या नहीं।

+1

और आप इसका उपयोग क्यों नहीं करते: http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of-the-currently-executing-method? – HimBromBeere

+0

ऐसी जानकारी प्राप्त करने के लिए आप 'स्टैकट्रेस' का उपयोग कर सकते हैं, लेकिन यह धीमा है। कुछ स्वचालित प्राप्त करने के लिए आप कोड-पीढ़ी का उपयोग कर सकते हैं (उदाहरण के लिए एक उपकरण जो कंपाइलर से पहले चलता है और कुछ और चीज़ों को बदल देता है) या एओपी (देखें [यह] (http://stackoverflow.com/q/25803/1997232))। – Sinatr

+0

क्या ऐसा नहीं होगा? 'System.Reflection.MethodInfo.GetCurrentMethod()। नाम' – Zorkind

उत्तर

47

आप nameof उपयोग नहीं कर सकते इसे प्राप्त करने के लिए, लेकिन इस वर्कअराउंड के बारे में:

नीचे कोई प्रत्यक्ष प्रतिबिंब नहीं है (जैसे nameof) और कोई स्पष्टीकरण नहीं सीट विधि का नाम।

Results.Add(GetCaller(), result); 

public static string GetCaller([CallerMemberName] string caller = null) 
{ 
    return caller; 
} 

GetCaller कोई भी तरीका है कि यह कॉल का नाम देता है।

+0

डाउन-वोट क्यों? – user3185569

+0

यह कैसे मदद करता है? आपको निष्पादन विधि के कॉलर की आवश्यकता है, न कि 'GetCaller' के कॉलर; जब तक कि आप यह काम करने के लिए * सभी * संभावित कॉल करने योग्य विधियों में एक वैकल्पिक पैरामीटर जोड़ने का प्रस्ताव नहीं कर रहे हैं, जो स्पष्ट रूप से, घृणास्पद है। – InBetween

+2

@ ओपी के बीच ओपी ने कहा "मौजूदा विधि का नाम प्राप्त करें" '। यह वही करता है जो उसने कहा था! आपको केवल एक 'GetCaller' विधि की आवश्यकता है जिसे आप वर्तमान निष्पादन विधि नाम प्राप्त करने के लिए कहीं से भी कॉल कर सकते हैं। – user3185569

0

आप परिणाम सूची में वर्तमान पद्धति के नाम जोड़ना चाहते हैं तो आप इसका उपयोग कर सकते:

StackTrace sTrace= new StackTrace(); 
StackFrame sFrame= sTrace.GetFrame(0); 
MethodBase currentMethodName = sFrame.GetMethod(); 
Results.Add(currentMethodName.Name, result); 

या आप उपयोग कर सकते हैं,

Results.Add(new StackTrace().GetFrame(0).GetMethod().Name, result);  
+3

नोट करें कि शायद विश्वसनीय नहीं है, क्योंकि विधि को रेखांकित किया जा सकता है। मैं यह भी धीमी होने की उम्मीद करता हूं। – svick

+0

सामान्य रूप से आपको कभी भी इन वर्गों का उत्पादन कोड –

+1

'सिस्टम में उपयोग नहीं करना चाहिए। Reflection.MethodInfo.GetCurrentMethod()' यह अधिक आसानी से (और शायद अधिक तेज़ी से) करेगा – GreatAndPowerfulOz

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