2010-01-12 14 views
46

यह एक मूर्खतापूर्ण सवाल की तरह है, लेकिन यह विधि है कि वर्तमान में है कि विधि के भीतर से क्रियान्वित किया जा रहा है के नाम प्राप्त करने के लिए संभव है के नाम प्राप्त करें?वर्तमान पद्धति

Public Sub SomeMethod() 

    Dim methodName as String = System.Reflection.[function to get the current method name here?] 

End Sub 

धन्यवाद

+0

चेक इस बाहर: http://geekswithblogs.net/opiesblog/archive/2006/06/29/83654.aspx –

+0

कि वास्तव में कैसे बुला विधि, नहीं वर्तमान में क्रियान्वित विधि का नाम पाने के लिए है। अभी भी शांत है, यद्यपि! की –

+0

संभावित डुप्लिकेट [आप प्रतिबिंब का उपयोग कर सकते वर्तमान में क्रियान्वित विधि का नाम खोजने के लिए?] (http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of -इस-वर्तमान-क्रियान्वित-विधि) –

उत्तर

97
+10

बेहतर आधार वर्ग का उपयोग करें: System.Reflection.MethodBase।GetCurrentMethod(); – marstone

+0

@marstone - क्या आप कृपया समझा सकते हैं क्यों? – PunkyGuy

+5

@PunkyGuy किसी ने कहा: "हालांकि दोनों कॉलों का बिल्कुल वही प्रभाव पड़ता है, लेकिन सामान्य रूप से कक्षा के उप-वर्गों पर साझा कार्यों को आमंत्रित करना एक बुरा विचार है, जिस पर उन्हें वास्तव में परिभाषित किया जाता है"। संदर्भ: http: //bytes.com/topic/visual-basic-net/answers/457334-methodinfo-methodbase – marstone

26

अन्य तरीकों क्या कहा गया था के करीब हैं, लेकिन वे स्ट्रिंग मूल्य वापस नहीं है। लेकिन इस करता है:

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name 
+0

बिंगो! मेरे लिए हल –

1
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name 
3

गारंटी देने के लिए है कि इस सवाल का जवाब प्रस्तुत के किसी भी वास्तव में कार्यावधि में काम (System.Reflection.MethodBase.GetCurrentMethod().Name), आप एक विशेषता जोड़ने की जरूरत है। कोई संकलक/क्रम झंडे कि मुझे लगता है कि ब्रेक की इस पद्धति का पता कर रहे हैं:

समारोह आप के must be marked

  • एफ # नाम [<System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>]
  • वीबी पाने के लिए कोशिश कर रहे हैं: <System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>

  • सी #: [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

इसके अलावा, आजकल, वहाँ VB में nameof() ऑपरेटर है, सी # (and maybe F# soon) जो अपने मामले के लिए nameof(SomeMethod) होगा (मेरा मानना ​​है कि वाक्य रचना के लिए यहाँ वीबी और सी # ही होगा)

3

एक और दृष्टिकोण का उपयोग किया जाएगा सिस्टम से Caller​Member​Name​Attribute। रनटाइम। कंपाइलर सेवा नामस्थान एक वैकल्पिक पैरामीटर को पॉप्युलेट करने के लिए। उदाहरण के लिए ...

Private Function GetMethodName(<System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) As String 

    Return memberName 

End Function 

के रूप में आप उम्मीद करेंगे समारोह लागू किया जाएगा ...

Public Sub DoSomeWork() 
    Dim methodName As String = GetMethodName() 
    Console.WriteLine($"Entered {methodName}") 

    ' Do some work 
End Sub 

के बजाय सिर्फ 'विधि नाम पुन: प्राप्त करने, समारोह भी विधि का उपयोग कर सकता है कोड को और सरल बनाने के लिए नाम पुनर्प्राप्त किया गया। उदाहरण के लिए ...

Private Sub TraceEnter(
    <System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) 

    Console.WriteLine($"Entered {memberName}") 

End Sub 

... इस तरह इस्तेमाल किया जा सकता है जो ...

Public Sub DoSomeWork() 
    TraceEnter() 

    ' Do some work 

End Sub 

CompilerServices नाम स्थान में अन्य गुण (कम से पूरा पथ पुनः प्राप्त करने के समान फैशन में इस्तेमाल किया जा सकता संकलन समय) स्रोत फ़ाइल और/या कॉल की लाइन संख्या का। नमूना कोड के लिए CallerMemberNameAttribute दस्तावेज़ देखें।

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