मैं एक स्थिति है जहाँ मैं आंतरिक रूप से एक 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));
}
अब संकलक खुश है। विधि को कॉल करना आसान है। उदाहरण के लिए, एक विंडोज पर KeyPress
घटना के लिए संलग्न नियंत्रण फॉर्म्स:
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)
+1: 1) स्थिर कन्स्ट्रक्टर का उपयोग करके और 2) प्रकार के प्रारंभिक अजीब डीबगिंग स्थितियों के कारण विस्तृत संदेश सहित। –
@MarcGravell: एक स्थिर प्रारंभकर्ता में एक अपवाद फेंक नहीं है का उल्लंघन 'CA1065: अप्रत्याशित locations' में अपवाद न बढ़ाएं ... मैं हमेशा इस धारणा है कि आप एक कस्टम कोड विश्लेषण नियम का उपयोग करना चाहिए की अवैध प्रयोगों को खोजने के लिए था, आपके कक्षा जो आम तौर पर रन-टाइम पर उपलब्ध नहीं होती है। –