2010-08-03 15 views
16

को देखते हुए:सी # इंटरफ़ेस विरासत

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

क्यों:

typeof(IB).GetMethods().Count() == 0; 

?

बस स्पष्ट होना:

public class A 
{ 
    public void TestMethod() 
    { 
    } 
} 

public class B : A 
{ 
} 

typeof(B).GetMethods().Count(); 

काम (यह रिटर्न 5) करता है;

एक बोनस के रूप:

typeof(IB).BaseType == null 

उत्तर

-1

आप GetMethods में कुछ BindingFlags को परिभाषित करने के लिए है()।

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count(); 
+3

मैंने बाइंडिंगफ्लैग को उजागर किया है क्योंकि वे मदद नहीं कर रहे हैं;)। – ppiotrowicz

+1

बाध्यकारी झंडे इस मामले में मदद नहीं करते हैं। कक्षाओं में शामिल होने पर वे मदद करते हैं। – Manfred

9

प्रयास करें यह GetMethods समारोह के डिजाइन हो रहा है। यह इंटरफेस में विरासत सदस्यों का समर्थन नहीं करता है। यदि आप सभी विधियों को खोजना चाहते हैं, तो आपको प्रत्येक इंटरफ़ेस प्रकार को सीधे पूछने की आवश्यकता है।

this MSDN article के समुदाय सामग्री अनुभाग देखें।

var ibCount = typeof(IB).GetMethods().Count(); // returns 0 
var iaCount = typeof (IB).GetInterfaces()[0].GetMethods().Count(); // return 1 

ध्यान दें कि उत्पादन कोड में मैं कोड में के रूप में आम तौर पर GetInterfaces()[0] का उपयोग नहीं कर सकेगा, जहां मैं इस प्रयोग करेंगे मैं नहीं कर सकता:

11

यहाँ दोनों आइए और आईबी के लिए मायने रखता है प्राप्त करने के लिए कोड है मान लें कि मेरे पास हमेशा कम से कम एक इंटरफ़ेस होगा।

मैं भी इस प्रकार BindingFlags बाहर करने की कोशिश की:

const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; 
var ibCount = typeof(IB).GetMethods(bindingFlags).Count(); 

बहरहाल, यह अभी 0 वापस आ जाएगी इंटरफ़ेस IB के रूप में अभी भी विधि TestMethod() को लागू नहीं करता है। इंटरफ़ेस IA करता है। बाध्यकारी झंडे का उपयोग करना काम करेगा यदि IA और IB दोनों कक्षाएं थीं। उस स्थिति में, आपको 5 का रिटर्न वैल्यू मिलता है। यह मत भूलना कि आईए पूरी तरह से कक्षा Object से प्राप्त हुआ है!

+0

उस उत्तर के लिए धन्यवाद। मुझे पता है कि मैं इंटरफेस पर फिर से शुरू कर सकता हूं और उनसे तरीकों को प्राप्त कर सकता हूं। मेरा सवाल यह था कि मैं ऐसा क्यों नहीं कर सकता। – ppiotrowicz

2

आईए का एक इंटरफेस होने के लिए आईए पर विचार करें, इसका आधार नहीं।

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