2010-09-07 10 views
16

द्वारा लौटाए गए ऑटो-जनरेटेड विधियों (गेटटर/सेटर/एड/हटा/.etc) को फ़िल्टर करना I किसी दिए गए प्रकार के तरीकों की एक सरणी पुनर्प्राप्त करने के लिए Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) का उपयोग करें।टाइप-गेटमाइड्स()

समस्या लौटाई गई है MethodInfo संकलक द्वारा जेनरेट की गई विधियों को शामिल कर सकता है जो मैं नहीं चाहता हूं। उदाहरण के लिए:

  • संपत्ति bool Enabled { get; } bool get_Enabled()

  • घटना SomethingChanged मिल जाएगा add_SomethingChanged(EventHandler) और remove_SomethingChanged(EventHandler)

मैं शायद कुछ फिल्टर तर्क जोड़ सकते हैं उनमें से छुटकारा पाने के लिए मिल जाएगा जो संभावित रूप से बहुत जटिल हो सकता है। मैं जानना चाहता हूं कि क्या कुछ और है जो मैं कर सकता हूं, जैसे BindingFlags सेटिंग्स, केवल उपयोगकर्ता परिभाषित विधियों को पुनर्प्राप्त करने के लिए?

+0

([गेटर/सेटर की MethodInfo से होस्टिंग PropertyInfo ढूँढना] के संभावित डुप्लिकेट http://stackoverflow.com/questions/520138/finding-the-hosting-propertyinfo-from-the- methodinfo-of-getter-setter) –

उत्तर

25
typeof(MyType) 
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
    .Where(m => !m.IsSpecialName) 
+0

मैंने समेकन को ध्यान में नहीं लिया, लेकिन यह क्या है जो समवर्ती रूप से खतरनाक दोनों का उपयोग कर रहा है? जब गुगल हो रहा था, मैंने कुछ पूर्व फोरम पोस्ट देखे थे, जिसमें कुछ उदाहरणों में IsSpecialName अविश्वसनीय है, लेकिन चूंकि वे .NET 1.0 के संदर्भ में इसके बारे में बात कर रहे थे, मैंने अभी माना कि यह समस्या 3.5 या उससे पहले संबोधित की गई थी। – Dan7

2

मुझे लगता है कि आपकी सबसे अच्छी शर्त CompilerGenerated विशेषता वाले विधियों को फ़िल्टर करना होगा। यह भविष्य के सबूत होने की संभावना है, हालांकि यह इस विशेषता को पूरी तरह से अपमानित करने वाले अनुमानित भविष्य के कंपाइलरों के लिए जिम्मेदार नहीं है। IsSpecialName परीक्षण शायद भी आवश्यक है क्योंकि ऐसा लगता है कि C# कंपाइलर add और remove विधियों में विशेषता को संलग्न नहीं करता है।

+0

आप 'कहां (m =>! M.GetCustomAttributes (typeof (CompilerGeneratedAttribute), सत्य का उपयोग कर सकते हैं।)()) उन्हें फ़िल्टर करने के लिए। अगर मेरा उत्तर या आपका उत्तर बेहतर है तो यह स्पष्ट नहीं लगता है। –

+0

अरे। कुछ और परीक्षणों के बाद मुझे गलती हुई कि कंपाइलर जेनरेटेड एट्रिब्यूट काम करता है, असल में यह नहीं करता है। मेरा गेटटर/सेटर/ऐड/निकालें विधियों में यह विशेषता नहीं है। अजीब। शायद यह केवल ऑटो-कार्यान्वयन विधियों से जुड़ा हुआ है? और उपयोगकर्ता कार्यान्वयन वाले सेटटर/गेटर विधियों को यह विशेषता नहीं मिलती है। – Dan7

+0

@ Dan7 क्या आपको समसामयिक रूप से दोनों तरीकों का उपयोग करने के लिए यह लायक लगता है? ऐसा लगता है कि लोग इस बात से सहमत नहीं हैं कि सबसे अच्छा तरीका कौन सा है। –

-1

रहस्य बाइंडिंगफ्लैग है। DeclaredOnly

typeof(MyType).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)