2012-09-10 16 views
11

मैं निम्नलिखित वर्ग पेड़ है वापस नहीं करता है:सी # GetMethod एक माता पिता विधि

public class A 
{ 
    public static object GetMe(SomeOtherClass something) 
    { 
     return something.Foo(); 
    } 
} 

public class B:A 
{ 
    public static new object GetMe(SomeOtherClass something) 
    { 
     return something.Bar(); 
    } 
} 

public class C:B 
{ 

} 

public class SomeOtherClass 
{ 

} 

को देखते हुए SomeOtherClass parameter = new SomeOtherClass()) इस काम करता है:

typeof(B).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter)); 

लेकिन इस:

typeof(C).GetMethod("GetMe", new Type[] { typeof(SomeOtherClass) })).Invoke(null, parameter)); 

फेंकता एक NullReferenceException, जबकि मेरी इच्छा है कि यह उपरोक्त की तुलना में सटीक विधि को कॉल करेगी।

मैंने कई बाध्यकारी झंडे का कोई फायदा नहीं लिया है। कोई मदद?

उत्तर

19

आपको overloadsBindingFlags पैरामीटर लेने का उपयोग करना चाहिए, और FlattenHierarchy शामिल करना चाहिए।

निर्दिष्ट करता है कि पदानुक्रम के ऊपर सार्वजनिक और संरक्षित स्थैतिक सदस्यों को वापस किया जाना चाहिए। विरासत कक्षाओं में निजी स्थिर सदस्य वापस नहीं आते हैं। स्टेटिक सदस्यों में फ़ील्ड, विधियों, घटनाओं और गुण शामिल हैं। नेस्टेड प्रकार वापस नहीं आते हैं।

(निजी स्थिर तरीकों के बारे में बात दूर करने के लिए संपादित, अब सवाल उन्हें सार्वजनिक बनाना बदल दिया गया है।)

+0

विधियां सार्वजनिक स्थिर हैं, मैंने सवाल को गलत तरीके से लिखा (और मैंने सोचा कि मेरे पास सबूत पढ़ा गया है :)। धन्यवाद अभी भी! –

+1

@ सेबस्टियन वानस्टीनकिस्टे: उस स्थिति में, फ्लैटनहेरार्ची (और स्थिर, और सार्वजनिक) को शामिल करने के लिए बाध्यकारी झंडे को बदलना ठीक होना चाहिए। –

+0

बहुत धन्यवाद! भविष्य की पीढ़ियों के लिए: 'टाइपोफ़ (सी) .GetMethod ("GetMe", बाइंडिंगफ्लैग्स। फ्लैटनहेरार्ची | बाइंडिंगफ्लैग्स.पब्लिक | बाइंडिंगफ्लैग्स। स्टेटिक, नल, नया टाइप [] {टाइपोफ (कुछऑथ क्लास)}, शून्य))। (नल) , पैरामीटर)); 'चाल थी। –

4

आप पदानुक्रम ऊपर खोज करने के लिए आदेश में GetMethod को BindingFlags.FlattenHierarchy ध्वज पारित करने के लिए की जरूरत है:

typeof(C).GetMethod("GetMe", BindingFlags.FlattenHierarchy, null, new Type[] { typeof(SomeOtherClass) }, null)).Invoke(null, parameter)); 
+0

मुझे लगता है कि 'FlattenHierarchy' याद किया है .. धन्यवाद, मैं अभी कोशिश करूँगा! –

+1

न केवल 'FlattenHierarchy' जोड़ना बल्कि 'सार्वजनिक' और 'स्टेटिक' ने इसे हल किया। –

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

  • कोई संबंधित समस्या नहीं^_^