2009-05-29 15 views
5

का मूल कार्यान्वयन ढूंढें मैं यह निर्धारित करने के लिए प्रतिबिंब का उपयोग करने की कोशिश कर रहा हूं कि व्युत्पन्न वर्ग किस वर्ग को बेस क्लास से ओवरराइड करता है। यह निर्धारित करना काफी आसान है कि विधि ओवरराइड नहीं है, लेकिन यह निर्धारित करने की कोशिश कर रहा है कि बेस क्लास में कोई विधि ओवरराइड है या व्युत्पन्न कक्षा में वर्चुअल के रूप में बनाई गई है, जिसे मैं पूरा करने की कोशिश कर रहा हूं।वर्चुअल विधि

तो, यदि कक्षा ए में वर्चुअल विधियों की प्रक्रिया और निर्यात है, और कक्षा बी में वर्चुअल विधियां प्रक्रिया (ओवरराइड), और डिस्प्ले (नई आभासी विधि) है, तो मुझे कक्षा बी की जांच करते समय निम्नलिखित परिणाम चाहिए:

  • तरीके अधिरोहित: प्रक्रिया
  • तरीके ओवरराइड नहीं: निर्यात

मैं केवल प्रदर्शन विधि से निपटने के लिए चाहते हैं जब एक वर्ग है कि

उत्तर

6

कक्षा बी से निकला है की जांच है GetBaseDefinition क्या तुम के बाद हो

मूल रूप से

if (method.GetBaseDefinition() == method) 
{ 
    // Method was declared in this class 
} 

यहाँ मामलों में आपकी रुचि है दिखा एक उदाहरण है:

using System; 
using System.Reflection; 

class Base 
{ 
    public virtual void Overridden() {} 
    public virtual void NotOverridden() {} 
} 

class Derived : Base 
{ 
    public override void Overridden() {} 
    public virtual void NewlyDeclared() {} 
} 

public class Test 
{ 
    static void Main() 
    { 
     foreach (MethodInfo method in typeof(Derived).GetMethods()) 
     { 
      Console.WriteLine("{0}: {1} {2} {3}", 
           method.Name, 
           method == method.GetBaseDefinition(), 
           method.DeclaringType, 
           method.GetBaseDefinition().DeclaringType); 
     } 
    } 
} 

आउटपुट:

Overridden: False Derived Base 
NewlyDeclared: True Derived Derived 
NotOverridden: False Base Base 
ToString: False System.Object System.Object 
Equals: False System.Object System.Object 
GetHashCode: False System.Object System.Object 
GetType: True System.Object System.Object 
+1

बिल्कुल सही, बिल्कुल जो मैं खोज रहा था। मुझे विश्वास नहीं है कि मैं इसे चूक गया;)। –

0

मैं उम्मीद करेंगे कि BindingFlags.DeclaredOnly प्रकार के साथ प्रयोग किया .GetMethods() आपको वह प्रभाव मिलेगा जो आप ढूंढ रहे हैं:

http://msdn.microsoft.com/en-us/library/4d848zkb(loband).aspx

+1

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

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