2010-03-23 9 views
6

प्रतिबिंब के माध्यम से आप अज्ञात तरीकों की पहचान कैसे कर सकते हैं?सिस्टम में अज्ञात विधियों की पहचान कैसे करें। प्रतिबिंब

+0

क्या आप जो कुछ हासिल करना चाहते हैं उसके बारे में कुछ और कह सकते हैं? –

उत्तर

7

विधि के गुणों को देखें, और देखें कि विधि CompilerGeneratedAttribute से सजाया गया है या नहीं।

बेनामी विधियों (साथ ही साथ अन्य ऑब्जेक्ट्स, जैसे ऑटो-कार्यान्वित गुण इत्यादि) में यह विशेषता शामिल होगी।


उदाहरण के लिए, मान लें कि आपके पास अपनी कक्षा के लिए एक प्रकार है। अनाम तरीकों होगा:

Type myClassType = typeof(MyClass); 
IEnumerable<MethodInfo> anonymousMethods = myClassType 
    .GetMethods(
      BindingFlags.NonPublic 
     | BindingFlags.Public 
     | BindingFlags.Instance 
     | BindingFlags.Static) 
    .Where(method => 
      method.GetCustomAttributes(typeof(CompilerGeneratedAttribute)).Any()); 

यह किसी भी गुमनाम तरीकों MyClass पर परिभाषित लौटना चाहिए।

+0

और इसलिए कोई अन्य विधि (या सदस्य/प्रकार) कर सकते हैं। – leppie

+0

सच - आप इसे किसी भी विधि पर मैन्युअल रूप से परिभाषित कर सकते हैं, और इसे मूर्ख बना सकते हैं, लेकिन आम तौर पर, इसका उपयोग अनाम विधियों और अन्य संकलक उत्पन्न जानकारी के लिए किया जाता है। –

+0

ऑटो गुणों के लिए, और संपत्ति गेटर्स और सेटर्स पर भी। – leppie

4
मैं क्या देख सकते हैं से

, कि Regex पैटर्न होगा:

<(\w|_)+>b_.+ 
7

आप नहीं कर सकते, क्योंकि आईएल स्तर पर एक गुमनाम तरीके के रूप में ऐसी कोई बात नहीं है वहाँ - वे सभी नामित कर रहे हैं, और सभी के हैं नामित प्रकार और जिस तरह से सी # और वीबी कंपाइलर्स नामित विधियों और प्रकारों के लिए अनाम विधियों का अनुवाद करते हैं, पूरी तरह कार्यान्वयन-परिभाषित है, और इस पर भरोसा नहीं किया जा सकता है (जिसका अर्थ है कि, उदाहरण के लिए, यह किसी भी अद्यतन के साथ बदल सकता है, यहां तक ​​कि मामूली रिलीज/हॉटफिक्सेस में भी)।

+3

+1: यह तकनीकी रूप से, "सही" उत्तर है - लेकिन [कंपाइलर जेनरेटेड] अभ्यास में काफी भरोसेमंद काम करता है। –

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