मैं एक ऐसी स्थिति में आया था जहां मुझे Delegateआंतरिक रूप से निपटने की जरूरत थी लेकिन मैं एक सामान्य बाधा चाहता था। विशेष रूप से, मैं प्रतिबिंब का उपयोग करके एक घटना हैंडलर जोड़ना चाहता था, लेकिन मैं प्रतिनिधि के लिए एक सामान्य तर्क का उपयोग करना चाहता था। नीचे दिए गए कोड नहीं काम करते हैं, के बाद से "हैंडलर" एक प्रकार चर रहा है, और संकलक डाली नहीं होगा करता है Handlerकरने के लिए Delegate:
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
हालाँकि, आप एक फ़ंक्शन पास कर सकते हैं जो आपके लिए रूपांतरण करता है। convertएक Handlerतर्क लेता है और एक रिटर्न देता है Delegate:
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
अब कंपाइलर खुश है। विधि को कॉल करना आसान है। उदाहरण के लिए, KeyPressWindows प्रपत्र नियंत्रण पर ईवेंट को संलग्न करना :
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
SomeControl_KeyPressईवेंट लक्ष्य कहां है। कुंजी कनवर्टर लैम्ब्डा है - यह कोई काम नहीं करता है, लेकिन यह संकलक को आश्वस्त करता है कि आपने इसे एक वैध प्रतिनिधि दिया था।
(280Z28 से शुरू करें) @ जस्टिन: इसका उपयोग क्यों नहीं करते?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(अंत 280Z28)