2012-09-18 11 views
6

कुछ वर्गों इस तरह देखते हुए बराबर है:ToString लौट मत करो,, GetHashCode, Type.GetMethods() के साथ GetType

public class MyBaseClass() 
{ 
    public void MyMethodOne() 
    { 
    } 

    public virtual void MyVirtualMethodOne() 
    { 
    } 
} 

public class MyMainClass : MyBaseClass() 
{ 
    public void MyMainClassMethod() 
    { 
    } 

    public override void MyVirtualMethodOne() 
    { 
    } 
} 

अगर मैं निम्नलिखित चलाएँ:

var myMethods= new MyMainClass().GetType().GetMethods(); 

मैं वापस मिल:

  • MyMethodOne
  • MyVirtualMethodOne
  • MyMainClassMethod
  • ToString
  • बराबर
  • GetHashCode
  • GetType

मैं पिछले 4 तरीकों से कैसे बच सकते में myMethods

  • ToString लौटाए जाने
  • बराबर
  • GetHashCode
  • GetType

संपादित

अब तक, इस हैक काम कर रहा है, लेकिन सोच रहा था अगर वहाँ एक क्लीनर तरीका था:

 var exceptonList = new[] { "ToString", "Equals", "GetHashCode", "GetType" }; 
     var methods = myInstanceOfMyType.GetType().GetMethods() 
      .Select(x => x.Name) 
      .Except(exceptonList); 
+1

आप ['BindingFlags.DeclaredOnly'] (http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx) का उपयोग केवल 'MyMainClassMethod' और' MyVirtualMethodOne' प्राप्त करने के लिए कर सकते हैं, लेकिन मैं नहीं करता लगता है कि "ऑब्जेक्ट' में शामिल विधियों के लिए घोषित विधियों के लिए एक समान ध्वज है, लेकिन इसमें शामिल नहीं है"। – Rawling

उत्तर

7

तुम भी चाल कर सकते हैं:

var methods = typeof(MyMainClass) 
        .GetMethods() 
        .Where(m => !typeof(object) 
            .GetMethods() 
            .Select(me => me.Name) 
            .Contains(m.Name)); 
4

इस प्रयास करें।

GetMethods().Where((mi)=> mi.DeclaringType != typeof(object)); 
LINQ का एक छोटा सा के साथ

, आप सभी तरीकों object वर्ग में घोषित समाप्त कर सकते हैं।

+0

यह वही नहीं है जो वह चाहता है - यह केवल तीन तरीकों में से दो देगा। – Rawling

+2

असल में, यह मुझे शून्य तरीकों देता है ....: -s – Alex

+1

हाँ, आपको 'बाइंडिंगफ्लैग्स' इंस्टेंस का उपयोग करना होगा। बाइंडिंगफ्लैग्स। स्टेटिक | बाइंडिंगफ्लैग्स। सार्वजनिक | BindingFlags.DeclaredOnly'। (ये पहले तीन 'GetMethods()' अधिभार द्वारा उपयोग किए जाने वाले झंडे हैं।) – Rawling

8

आप का उपयोग करते हैं

var myMethods = new MyMainClass().GetType().GetMethods() 
    .Where(m => m.DeclaringType != typeof(object)); 

आप जब तक कि वे अपने पदानुक्रम में कहीं अधिरोहित किया गया है, उन नीचे चार विधियों को छोड़ देगा।

(मैं इस व्यवहार को अपने आप चाहते हैं, लेकिन अगर आप चाहते हैं बाहर रखा उन चार जो कुछ, तो चुओंग का जवाब यह कर देगा।)

+0

उन्हें वापस करने के लिए उपरोक्त, हालांकि इस मामले में मैं उन्हें पूरी तरह से बाहर करना चाहता था – Alex

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