2012-11-12 12 views
9

मैं आधार Windows Forms रूप बनाने की कोशिश कर रहा हूं जिसमें सामान्य कार्यक्षमता और नियंत्रण होता है - लेकिन उस वर्ग के संदर्भ भी रखता है जिसके लिए इसके तरीकों के लिए एक प्रकार की आवश्यकता होती है। प्रत्येक प्रपत्र एक अलग प्रकार का प्रतिनिधित्व करेगी, इसलिए मैंने सोचा कि मैं इस की तर्ज पर कुछ कर सकते हैं कि:जेनेरिक प्रकारों के साथ बेस विंडोज फॉर्म फॉर्म क्लास क्यों डिज़ाइनर लोडिंग को रोकता है?

public partial class Base<T> : Form where T : BaseClass 
{ 
    private GenericHandler handler = new GenericHandler(); 
} 

public class BaseClass { } 

public class GenericHandler 
{ 
    public void DoSomethingWithInstance<T>(T instance) where T : BaseClass 
    { 

    } 
} 

मेरे डिजाइनर वर्ग घोषणा भी दर्पण क्या मेरी रूप है। अब जब मैं किस प्रकार Foo का प्रतिनिधित्व करता है मेरी दूसरी प्रपत्र करते हैं, मैं, डिजाइनर उपयोग नहीं कर सकते क्योंकि मैं इस त्रुटि मिलती है:

The designer could not be shown for this file because none of the classes within it can be designed. The designer inspected the following classes in the file: Foo --- The base class 'WindowsFormsApplication1.Base' could not be loaded. Ensure the assembly has been referenced and that all projects have been built.

FooClass --- The base class 'WindowsFormsApplication1.BaseClass' cannot be designed.

public partial class Foo : Base<FooClass> 
{ 
    public Foo() 
    { 
     InitializeComponent(); 
    } 
} 

public class FooClass : BaseClass { } 

इस क्यों होता है/क्या मैं वहाँ गलत कर रहा हूँ या कर रहे हैं ऐसा करने के लिए कोई और तरीका?

+3

कोई स्पष्टीकरण नहीं है, लेकिन ध्यान दें कि आप सामान्य आधार वर्ग नहीं होने के कारण इस मुद्दे के आसपास काम कर सकते हैं (लेकिन मैं करता हूं), लेकिन एक मध्यवर्ती आधार वर्ग जो स्वयं एक सामान्य वर्ग से प्राप्त होता है: 'Foo: FooBase', 'FooBase: बेस '। इसके आधार के अलावा 'फूबेस' की परिभाषा में कुछ भी नहीं है। – hvd

+0

@hvd यह एक इलाज करता है। मैं इसे एक उत्तर के रूप में स्वीकार करता हूं लेकिन यह एक टिप्पणी है। – LukeHennerley

+0

मैंने इसे एक टिप्पणी के रूप में पोस्ट किया क्योंकि यह आपके द्वारा पूछे गए प्रश्न का उत्तर नहीं देता है; मुझे लगता है कि आपको इसे स्वीकार नहीं करना चाहिए। यहां तक ​​कि यदि आपके द्वारा पूछे जाने वाले प्रश्न से अब आपके लिए कोई फर्क नहीं पड़ता है :) – hvd

उत्तर

15

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

आपके मामले में हालांकि यह बेस क्लास का उदाहरण नहीं बना सकता है, क्योंकि इसमें एक सामान्य पैरामीटर है। वही बात तब होती है जब आपके फॉर्म का बेस क्लास या आपका नियंत्रण अमूर्त है या उसके पास डिफॉल्ट कन्स्ट्रक्टर नहीं है। उन मामलों में डिजाइनर भी आपकी बेस क्लास का उदाहरण नहीं बना पाएगा।

a workaroundTypeDescriptionProviderAttribute का उपयोग कर इस के लिए जहां आप डिज़ाइनर को एक प्रतिस्थापन वर्ग दे सकते हैं जिसे इसे तुरंत चालू करना चाहिए।

+0

यद्यपि आप उत्तर देते हैं कि यह क्यों काम नहीं करता है - मैं समझ नहीं पा रहा हूं कि आप सामान्य पैरामीटर क्लास को कैसे चालू नहीं कर सकते हैं, जब आपके पास 'पब्लिक क्लास जेनेरिक क्लास {}' आप 'जेनेरिक क्लास जीसी = नया जेनेरिक क्लास (); 'तो प्रारंभिक घटक इसे क्यों संभाल नहीं सकते हैं? क्या यह डिज़ाइनर को नीचे नहीं जानता है कि इंस्टेंसेशन में किस प्रकार का उपयोग करना है? – LukeHennerley

+0

'T' एक ठोस वर्ग के लिए resoved जाना चाहिए, ताकि नहीं, तुम ऐसा नहीं कर सकते' GenericClass जीसी = नए GenericClass (); ' – bitbonk

+0

क्षमा करते हैं मुझे फिर से मुहावरा है कि' GenericClass जीसी = नए GenericClass () ; 'आप तर्क के लिए ऐसा कर सकते हैं क्योंकि ऐसा इसलिए है क्योंकि मैं मूल रूप के प्रकार के रूप में' FooClass' को पास कर रहा हूं, मुझे लगता है कि यह संभावित रूप से प्रारंभिक घटक के दौरान इसे छोड़ सकता है।क्या कोई तरीका है कि आप सुझाव दे सकते हैं कि मैं डिज़ाइनर को अपनी लाइनों के साथ कुछ करने में कैसे सक्षम हो सकता हूं? – LukeHennerley

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