2009-10-26 8 views
6

मुझे यह छोटी समस्या है, कि मैं गैर सामान्य प्रकार पर जेनेरिक विधि के MethodInfo को वापस पाने के लिए Type.GetMethod को पास करने के लिए कौन से तर्कों को समझने के लिए नहीं समझ सकता। विशेष रूप से, मैं इस प्रकार की परिभाषा है:एक गैर सामान्य जेनेट प्रकार पर एक सामान्य विधि के MethodInfo कैसे प्राप्त करें?

public static class A 
{ 
    public static B F<T>(bool dummy) 
    { 
    } 
    public static B F<T>(IEnumerable<T> arg) 
    { 
    ... 
    } 
} 

मैं कई की कोशिश की है Type.GetMethod पर ले जाता है, लेकिन कोई भी एफ विधि के MethodInfo लौट आते हैं।

मुझे पता है कि मैं Type.GetMethods या यहां तक ​​कि टाइप भी कर सकता हूं। ढूँढें, लेकिन मुझे Type.GetMethod में रूचि है।

कोई विचार?

धन्यवाद।

संपादित

वास्तव में, मेरी कोड में थोड़ा और अधिक जटिल है। सामान्य विधि अधिभारित है, इसलिए मैं केवल कार्य नाम के साथ Type.GetMethod का उपयोग नहीं कर सकता। मैं इन वेरिएंट की कोशिश की:

typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
+0

कृपया जिस कोड को आपने आजमाया है उसे पोस्ट करें। –

+0

मेरा प्रश्न बदल दिया। धन्यवाद। – mark

+0

@ मार्क मैंने अपना जवाब बदल दिया। –

उत्तर

6

समस्या यह है कि IEnumerable<> पैरामीटर जो आप GetMethod पर जा रहे हैं, विशिष्ट नहीं है। यह वास्तव में एक IEnumerable<T> है, जहां T उस विधि द्वारा निर्दिष्ट किया गया है जिसे आप पुनर्प्राप्त करने का प्रयास कर रहे हैं। लेकिन, हम TMethodInfo.GetGenericArguments() के माध्यम से नहीं प्राप्त कर सकते हैं क्योंकि हमारे पास विधि का संदर्भ नहीं है - हम अभी भी इसे पुनर्प्राप्त करने का प्रयास कर रहे हैं।

दुर्भाग्य से, यह वह जगह है जहां प्रतिबिंब एपीआई कम हो जाती है। Type.GetMethod() अधिभार नहीं है जो आपको ओवरलोडेड विधियों के बीच अंतर करने की अनुमति देता है, जहां एक सामान्य विधि है।

तो इसके साथ ही, आप Type.GetMethods() का उपयोग कर फंस गए हैं और परिणामों को अपनी पसंद के पूर्वानुमान के साथ फ़िल्टर कर रहे हैं। जिस विधि में आप रुचि रखते हैं उसे प्राप्त करने के लिए, आप निम्न कार्य कर सकते हैं।

void getMethod() 
{ 
    typeof(A).GetMethods().Where(m => 
     m.IsGenericMethod && 
     m.GetParameters()[0].ParameterType.GetGenericTypeDefinition() 
      == typeof(IEnumerable<>)); 
} 

एनबी। मैंने सत्यापित नहीं किया है कि GetGenericTypeDefinition() कॉल आवश्यक है; आप इसे छोड़ने में सक्षम हो सकते हैं। विचार यह है कि आप A<T> को A<> में बदल रहे हैं, लेकिन रनटाइम पहले से ही आपको उस रूप में दे सकता है।

5

(जवाब में अपडेट किया गया स्पष्टीकरण सवाल करने के लिए):,

विधि GetMethod (जैसे एक पंक्ति।) का उपयोग करने के लिए एक संभाल पाने के लिए कोई तरीका नहीं है क्योंकि विधि को परिभाषित करने के लिए सामान्य डेटा तब तक उपलब्ध नहीं है जब तक हमारे पास निरीक्षण करने की विधि न हो।

MethodInfo[] methods = typeof(A).GetMethods(BindingFlags.Static | BindingFlags.Public); 
MethodInfo genericMethod = methods.Where(m=>m.IsGenericMethod).First(m=>m.ContainsGenericParameters); 
genericMethod = genericMethod.GetGenericMethodDefinition(); 
  1. जाओ तरीकों
  2. विधि सामान्य मानकों है कि पता लगाएं (यह मानते हुए आप केवल एक है - अगर आप एक से अधिक जोड़ने के लिए, यह एक छोटे से अधिक मजबूत होने की जरूरत है)
  3. जाओ जेनेरिक methodinfo
+1

धन्यवाद, लेकिन मैंने सवाल में थोड़ा गहराई से गुमराह किया है। मैंने इसे और अधिक सटीक बनाने के लिए बदल दिया है। – mark

+0

धन्यवाद, लेकिन जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, मुझे पता है कि GetMethods या FindMember के साथ इसे कैसे करें। मुझे विशेष रूप से GetMethod में दिलचस्पी है, क्योंकि इसे नौकरी भी करनी चाहिए, लेकिन यह मुझे परेशान नहीं करता है और इससे मुझे परेशान करता है। – mark

+0

@ मार्क इसे करने का कोई तरीका नहीं है, क्योंकि विधि को परिभाषित करने के लिए सामान्य डेटा तब तक उपलब्ध नहीं है जब तक हमारे पास निरीक्षण करने की विधि न हो। –

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