2009-12-11 6 views
6

मैं निम्न विधि हस्ताक्षर है:यह जांच कर रहा है कि कोई ऑब्जेक्ट [] args` एक प्रतिनिधि उदाहरण को संतुष्ट करता है या नहीं?

public static void InvokeInFuture(Delegate method, params object[] args) 
{ 
    // ... 
} 

प्रतिनिधि और तर्क भविष्य प्रेरक के लिए एक संग्रह करने के लिए सहेजे जाते हैं।

क्या कोई तरीका है कि मैं जांच सकता हूं कि क्या तर्क सरणी इसे आमंत्रित किए बिना प्रतिनिधि आवश्यकताओं को पूरा करती है या नहीं?

धन्यवाद।

संपादित करें: प्रतिबिंब कार्यान्वयन के लिए धन्यवाद, लेकिन मैं ऐसा करने के लिए एक अंतर्निहित तरीका खोज रहा हूं। मैं पहिया को फिर से नहीं बदलना चाहता, .NET Framework में पहले से ही यह जांच Delegate.DynamicInvoke() के अंदर लागू की गई है, कार्यान्वयन जो उन सभी पागल विशेष मामलों को संभालता है जो केवल माइक्रोसॉफ्ट के डेवलपर्स के बारे में सोच सकते हैं, और यूनिट परीक्षण और क्यूए पास कर सकते हैं। क्या इस अंतर्निहित कार्यान्वयन का उपयोग करने का कोई तरीका है?

धन्यवाद।

उत्तर

6

आप निम्नानुसार प्रतिनिधि के विधि हस्ताक्षर प्राप्त करने के लिए प्रतिबिंब का उपयोग कर सकते हैं।

using System; 
using System.Reflection; 

bool ValidateDelegate(Delegate method, params object[] args) 
{ 
    ParameterInfo[] parameters = method.Method.GetParameters(); 
    if (parameters.Length != args.Length) { return false; } 

    for (int i = 0; i < parameters.Length; ++i) 
    { 
     if (parameters[i].ParameterType.IsValueType && args[i] == null || 
      !parameters[i].ParameterType.IsAssignableFrom(args[i].GetType())) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

"एक प्रतिनिधि के खिलाफ एक MethodInfo जाँच हो रही है" मुझे यह करने के लिए मारो, और आप एक कोड नमूना था! +1 अपने प्रश्न के पूर्ण उत्तर के लिए +1। –

+1

आपका कोड विरासत को संभालने वाला नहीं है, उदाहरण के लिए फ़ाइलस्ट्रीम प्रकार का तर्क एक वैध स्ट्रीम तर्क है। आपका कोड काम कर सकता है, लेकिन तथ्य यह है कि सीएलआर खुद को प्रतिनिधि के भीतर देख सकता है। इन्वोक()। क्या सीएलआर के चेकिंग कोड का पुन: उपयोग करने का कोई तरीका है? मैं सीएलआर के लिए पूरी तरह से संगत होना चाहता हूं। – DxCK

+1

नोट: आपको इस तरह के प्रकार की जांच नहीं करनी चाहिए, क्योंकि यह भिन्न उदाहरणों के लिए झूठी वापसी करेगा (उदाहरण के लिए 'ऑब्जेक्ट' स्वीकार करने वाला प्रतिनिधि झूठी वापसी करेगा यदि आप 'स्ट्रिंग' या कुछ और पास करते हैं)। मैं 'पैरामीटर [i] का उपयोग करने का सुझाव दूंगा। पैरामीटर टाइप। IAAignignable से (args [i] .GetType())' और इसके अतिरिक्त मूल्य प्रकार और 'शून्य' ('args [i] .getType()' के लिए चेक जोड़ना विफल हो जाएगा अगर 'तर्क [i] '' null' है)। – Lucero

1

लगता framework मूल रूप से यकीन है कि यह पहले से ही मूल्यांकन लोगों की एक सूची रखता है बनाने के लिए, ऊपर करता है जैसे कुछ उन्मूलन तर्क के साथ।

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