2010-06-25 8 views
7

मुझे EventInfo.AddEventHandler(...) विधि पता है जिसका उपयोग किसी ईवेंट को हैंडलर संलग्न करने के लिए किया जा सकता है। लेकिन अगर मैं ईवेंट हैंडलर के उचित हस्ताक्षर को भी परिभाषित नहीं कर सकता, तो क्या किया जाना चाहिए, जैसा कि, हैंडलर द्वारा अपेक्षित घटना तर्कों का संदर्भ भी नहीं है?इवेंट हैंडलर को प्रतिबिंब का उपयोग करके किसी ईवेंट में कैसे संलग्न करें?

मैं उचित कोड के साथ समस्या की व्याख्या करूंगा।

// परिदृश्य जब मेरे पास मेरे समाधान, शून्य प्रतिबिंब परिदृश्य में सब कुछ उपलब्ध है।

internal class SendCommentsManager 
{ 
    public void Customize(IRFQWindowManager rfqWindowManager) 
    { 
     rfqWindowManager.SendComment += HandleRfqSendComment; 
    } 

    private void HandleRfqSendComment(object sender, SendCommentEventArgs args) 
    { 
     args.Cancel = true; 
    } 
} 

अब, मैं प्रतिबिंब का उपयोग करके एक ही उद्देश्य प्राप्त करना चाहता हूं। मैं इसे सबसे अधिक समझने में सक्षम हूं लेकिन जब मैं घटना में एक प्रतिनिधि को जोड़ता हूं (AddEventHandler का उपयोग करके) यह "Error binding to target method." अपवाद फेंकता है।

मैं इस अपवाद के पीछे कारण समझता हूं, एक घटना में गलत प्रतिनिधि को जोड़ता हूं। लेकिन इसे हासिल करने के लिए कुछ रास्ता होना चाहिए।

internal class SendCommentsManagerUsingReflection 
{ 
    public void Customize(IRFQWindowManager rfqWindowManager) 
    { 
     EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment"); 
     eventInfo.AddEventHandler(rfqWindowManager, 
      Delegate.CreateDelegate(eventInfo.EventHandlerType, this, "HandleRfqSendComment")); 
     //<<<<<<<<<<ABOVE LINE IS WHERE I AM GOING WRONG>>>>>>>>>>>>>> 
    } 

    private void HandleRfqSendComment(object sender, object args) 
    { 
     Type sendCommentArgsType = args.GetType(); 
     PropertyInfo cancelProperty = sendCommentArgsType.GetProperty("Cancel"); 
     cancelProperty.SetValue(args, true, null); 
    } 
} 
+0

क्यों दूसरा तर्क के रूप में उपयोग नहीं SendCommentEventArgs ? बीटीडब्लू: इस पर एक नज़र डालें: http://msdn.microsoft.com/library/system.reflection.eventinfo.addeventhandler.aspx – Andreas

+0

मैं "SendCommentEventArgs" वाले डीएल के नवीनतम संस्करण को संदर्भित नहीं करना चाहता हूं। अगर मैं "SendCommentEventArgs" का उपयोग कर सकता हूं तो प्रतिबिंब का उपयोग करके ईवेंट हैंडलर को संलग्न करने की आवश्यकता नहीं है। –

उत्तर

9

मुझे लगता है कि क्योंकि HandleRfqSendComment निजी है अपने कोड विफल हो रहा है। इसके बजाय आप CreateDelegate पर अपना नाम पारित किए बिना सीधे उस विधि में एक प्रतिनिधि बना सकते हैं। फिर आप आवश्यक प्रकार के प्रतिनिधि कन्वर्ट करने के लिए निम्न विधि का उपयोग की आवश्यकता होगी:

public static Delegate ConvertDelegate(Delegate originalDelegate, Type targetDelegateType) 
{ 
    return Delegate.CreateDelegate(
     targetDelegateType, 
     originalDelegate.Target, 
     originalDelegate.Method); 
} 

अपने कोड में, आप इस प्रकार इस विधि का उपयोग कर सकते हैं:

EventInfo eventInfo = rfqWindowManager.GetType().GetEvent("SendComment"); 
Action<object, object> handler = HandleRfqSendComment; 
Delegate convertedHandler = ConvertDelegate(handler, eventInfo.EventHandlerType); 
eventInfo.AddEventHandler(rfqWindowManager, convertedHandler); 
संबंधित मुद्दे