2011-01-16 9 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

यह कोड एक अस्पष्ट स्ट्रिंग वापस करेगा: <Main>b__0अज्ञात विधियों में MethodInfo.GetCurrentMethod() का उपयोग

क्या अनाम विधियों को अनदेखा करने और अधिक पढ़ने योग्य विधि नाम प्राप्त करने का कोई तरीका है?

+6

और क्या नाम आप एक _anonymous_ विधि के लिए उम्मीद करते हैं ?? –

+0

मुझे एमएस एनोन के लिए कोई परेशानी नहीं है। विधि नाम जेनरेटर। मैंने सोचा कि क्या निकटतम गैर-अज्ञात विधि के लिए स्टैक ट्रेस में खोदने का कोई तरीका है? क्या यह जानने का कोई तरीका है कि एक MethodInfo उदाहरण अज्ञात है? – HuBeZa

उत्तर

6

आप इसे बाहर ले सकता है :

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

इसके अलावा; नहीं।

+0

हां। मुझे लगता है कि कब्जे वाले चर सबसे अच्छे और सबसे सरल समाधान हैं। – HuBeZa

6

नहीं, ऐसा नहीं है। यही कारण है कि यह एक अज्ञात विधि है। नाम स्वचालित रूप से संकलक द्वारा उत्पन्न होता है और अद्वितीय होने की गारंटी देता है। आप बुला विधि नाम प्राप्त करना चाहते हैं आप तर्क के रूप में इसे पारित कर सकते हैं:

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

या यदि आप वास्तव में एक सार्थक नाम चाहते हैं आप इसे प्रदान करने के लिए की आवश्यकता होगी:

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

दुर्भाग्यवश, मैं पैरामीटर पास नहीं कर सकता क्योंकि यह एक तृतीय पक्ष एपीआई है, और मैं इसे सिर्फ इसके लिए लपेटना नहीं चाहता हूं। क्या स्टैक ट्रेस में खोदने का कोई तरीका है? क्या यह जानने का कोई तरीका है कि 'MethodInfo' उदाहरण अज्ञात है? – HuBeZa

+2

@ हूबेज़ा, आप जांच सकते हैं कि MethodInfo को '[कंपाइलर जेनरेटेड] विशेषता के साथ सजाया गया है या नहीं। यह एक आवश्यक शर्त है और एक अज्ञात विधि होने के लिए एक अच्छी कैंडुडेट है लेकिन स्पष्ट रूप से पर्याप्त शर्त नहीं है: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod()। IsDefined (typeof (CompilerGeneratedAttribute), true); ' –

3

यदि आप उस फ़ंक्शन का नाम प्राप्त करना चाहते हैं जिसमें अज्ञात विधि आप में रहती है तो स्टैक यात्रा कर सकती है और कॉलिंग विधि का नाम प्राप्त कर सकती है। हालांकि ध्यान दें, कि यह तब तक काम करेगा जब तक आपकी वांछित विधि का नाम पदानुक्रम में एक कदम ऊपर है। हो सकता है कि आप एक गैर-अज्ञात विधि तक पहुंचने तक यात्रा का एक तरीका हो।

अधिक जानकारी के लिए देखें: http://www.csharp-examples.net/reflection-calling-method-name/

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