2016-06-23 3 views
5

में प्रतिबिंब का उपयोग किए बिना उस विधि के अंदर से विधि का नाम कैसे प्राप्त करें, मैं विधि के अंदर से ही अपना नाम प्राप्त करना चाहता हूं। यह नीचे दिखाए गए अनुसार reflection का उपयोग करके किया जा सकता है। लेकिन, मुझे प्राप्त करना चाहते हैं कि reflectionसी #

System.Reflection.MethodBase.GetCurrentMethod().Name 

नमूना कोड

public void myMethod() 
{ 
    string methodName = // I want to get "myMethod" to here without using reflection. 
} 

उत्तर

19

सी # 5 के बाद से आप, आप के लिए यह भरने के लिए संकलक प्राप्त कर सकते हैं इस तरह:

using System.Runtime.CompilerServices; 

public static class Helpers 
{ 
    public static string GetCallerName([CallerMemberName] caller = null) 
    { 
     return caller; 
    } 
} 

MyMethod में:

public static void MyMethod() 
{ 
    ... 
    string name = Helpers.GetCallerName(); // Now name=="MyMethod" 
    ... 
} 

ध्यान दें कि आप इस को गलत तरीके से उपयोग कर सकते हैं एक मूल्य में स्पष्ट रूप से गुजरकर:

string notMyName = Helpers.GetCallerName("foo"); // Now notMyName=="foo" 

सी # 6 में, वहाँ भी nameof है:

public static void MyMethod() 
{ 
    ... 
    string name = nameof(MyMethod); 
    ... 
} 

यह हुआ कि यदि विधि नाम के रूप में एक ही नाम का उपयोग कर रहे की गारंटी नहीं है, हालांकि - अगर आप nameof(SomeOtherMethod) का उपयोग इसके बारे में "SomeOtherMethod" के एक मूल्य होगा पाठ्यक्रम। लेकिन अगर आपको यह सही लगता है, तो MyMethod के नाम को किसी अन्य चीज़ पर दोबारा दोहराएं, कोई भी अर्ध-सभ्य रिफैक्टरिंग टूल आपके nameof के उपयोग को भी बदल देगा।

+0

बहुत बहुत धन्यवाद! –

+0

सी # 6.0 से संदर्भ के लिए धन्यवाद –

5

का उपयोग कर जैसा कि आपने कहा है कि आप प्रतिबिंब का उपयोग तो आप System.Diagnostics का उपयोग नीचे की तरह विधि नाम पाने के लिए कर सकते हैं करने के लिए नहीं करना चाहते हैं के बिना :

using System.Diagnostics; 

public void myMethod() 
{ 
    StackTrace stackTrace = new StackTrace(); 
    // get calling method name 
    string methodName = stackTrace.GetFrame(0).GetMethod().Name; 
} 

नोट: प्रतिबिंब स्टैक ट्रेस विधि की तुलना में कहीं तेजी से होता है।

+0

उत्तर के लिए धन्यवाद –

+0

@ बांडाराकामल जॉन स्कीट का जवाब मुझसे बेहतर है। इसके अलावा उन्होंने नवीनतम सी # संस्करणों से संदर्भ दिए हैं। तो उसका जवाब स्वीकार करने पर विचार करें। –