2009-08-25 23 views
22

मैं निम्नलिखित नियंत्रण परिभाषित करना चाहते हैं:सी # जेनरिक UserControl

public partial class ObjectSelectorControl<T> : UserControl where T : class 

समस्या यह है कि डिजाइनर इस का समाधान नहीं कर सकता है। क्या इस मुद्दे पर कोई कामकाज है?

+1

जब आप इसे करने की कोशिश, तुम कैसे वर्ग XAML पर घोषित किया था? –

उत्तर

31

यह काम करता है

public class Control1<T> : UserControl { ... } 

public class Control2 : Control1<double> { ... } 

public class Control3 : Control2 { ... } 

इसे यहाँ पढ़ा था:

http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/0c265543-d6f0-41f6-beeb-b89e0071c5c3

+2

+1 व्यावहारिक रूप से वही समाधान जैसा मैंने सुझाव दिया, लेकिन अधिक स्पष्ट रूप से वर्णित किया। –

+0

हाँ यह काम करता है और यह वही था जो मैं ढूंढ रहा था। – Toto

+0

एक अलग फ़ाइल में Control3 रखना सुनिश्चित करें। –

1

डिजाइनर का उपयोग करने में सक्षम होने के लिए आपका नियंत्रण क्या कर सकता है या नहीं कर सकता है इस पर कुछ प्रतिबंध हैं। मूल रूप से वे सभी आपके वर्ग को तुरंत चालू करने में सक्षम होने वाले डिजाइनर के चारों ओर घूमते हैं (एक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए, abstract आदि नहीं हो सकता है)। क्योंकि डिजाइनर को यह नहीं पता कि एक सामान्य तर्क के रूप में किस प्रकार गुजरना है (और मुझे संदेह है कि यह भी एक विचार है), आपकी कक्षा को तत्काल नहीं किया जा सकता है।

आपका सबसे अच्छा आशा अपने UserControl बना सकते हैं और protected के निर्माता को बदलने के लिए होगा (के बाद से डिजाइनर प्रतिबिंब का उपयोग करता है और दृश्यता पर ध्यान नहीं देता यह, मुझे विश्वास है, काम करेंगे,, लेकिन मैं नहीं 100% सकारात्मक हूँ)। इसके बाद आप उस UserControl से प्राप्त कर सकते हैं और अपनी जेनेरिक क्लास बना सकते हैं और बेस (protected) कन्स्ट्रक्टर को कॉल कर सकते हैं।

0

मुझे विश्वास नहीं है कि यह संभव है, क्योंकि डिजाइनर आपकी कक्षा का एक उदाहरण आमंत्रित करता है। यदि आप जेनेरिक का उपयोग करते हैं, तो डिजाइनर को यह नहीं पता कि 'टी' में किस प्रकार का होना है।

8

हमारे प्रोजेक्ट में हम जो करते हैं उसके बारे में बहुत कुछ लगता है।

एक आधार वर्ग कि सामान्य है नहीं है:

public class controlMessagesNonGenericParent : controlItemList<MailItem, MailItemCollection> 
{ 
} 

:

public partial class controlItemList<TBaseItem, TBaseItemCollection> : UserControl, IUIDispatcher 
    where TBaseItem : new() 
    where TBaseItemCollection : IItemCollection<TBaseItem> 

फिर प्रत्येक उपयोग के लिए हम एक गैर-जेनेरिक वर्जन (जो अभी भी डिजाइनर द्वारा इस्तेमाल नहीं किया जा सकता है) को परिभाषित। .. और फिर हम व्युत्पन्न है नियंत्रण है कि डिजाइनर में इस्तेमाल किया जा सकता है:

public partial class controlMessages : controlMessagesNonGenericParent 
{ 
... 
} 
+1

ऐसा लगता है कि आप विपरीत दिशा में जा रहे हैं, हालांकि। आपके पास एक सामान्य आधार है और आप डिजाइनर के लिए विशिष्ट ठोस कार्यान्वयन बना रहे हैं। ऐसा लगता है जैसे वह एक सामान्य नियंत्रण बनाना और इसे डिजाइन करना चाहता है। –

+1

आप सही हैं, लेकिन एक सामान्य कक्षा का उपयोग सीधे नियंत्रण के रूप में असंभव है। यही कारण है कि हम इसे subclass, तो यह डिजाइनर में इस्तेमाल किया जा सकता है। तथ्य यह है कि उप-वर्गीकृत संस्करण व्यवहार को संशोधित करते हैं, यहां अप्रासंगिक है। –

+1

सही, यह असंभव है, लेकिन यह उसकी समस्या का समाधान नहीं करता है।यह एक "हैक" नहीं है जो उसे समस्या के आसपास आने की अनुमति देगा। दरअसल, ऐसा लगता है कि समाधान दूसरी दिशा में जाता है (एक नियंत्रण बनाएं जो सामान्य नहीं है, डिज़ाइन करें, फिर इसे उपclass और इसे सामान्य बनाएं) अधिक समझ में आता है। मैं नहीं देखता कि यह कैसे हल करता है। –

0

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105876

बग को माइक्रोसॉफ्ट की साइट पर पोस्ट किया गया है और आप देख सकते हैं कि इसे "स्थगित" के रूप में चिह्नित किया गया है, इसमें कोई समाधान नहीं है !! ।

+0

वास्तव में "बग" की तरह प्रतीत नहीं होता है, यह जेनेरिक का उपयोग करने का एक परिणाम है। शायद वे भविष्य में वृद्धि प्रदान कर सकते हैं जो आपको आपूर्ति करने के लिए एक प्रकार का चयन करने की अनुमति देता है, लेकिन मैं इसे "बग" के रूप में वर्गीकृत नहीं करता। –

0

जेनरिक के बजाय संरचना का उपयोग करें। ObjectSelectorControl का उपयोग करने के बजाय, किसी अन्य प्रकार का एक सामान्य सदस्य (Selector<T> शायद) दें और सामान्य होने के लिए मजबूर करने की कोशिश करने के बजाय उस ऑब्जेक्ट पर कार्य करें।

+1

शायद मैं गलत हूं लेकिन यदि आप अपने UserControl के अंदर संरचना का उपयोग करते हैं: ए) आपको जेनेरिक विशेषता का प्रकार निर्दिष्ट करना होगा या बी) आपको क्लास जेनेरिक भी बनाना होगा ताकि मुझे आपका मतलब न हो। –

+0

संरचना जेनेरिक के लिए एक प्रतिस्थापन तकनीक नहीं है। शायद जेनिक्स के साथ WinForms काम करने का एक समाधान तैयार किया जा सकता है, जिसमें संरचना शामिल है, लेकिन उस स्थिति में आपका उत्तर किसी भी दिशा का संकेत नहीं देता है। – MarioDS

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