2011-01-24 9 views
5

मैं (unable to cast T to System.Web.UI.Control)मेरा पहला सामान्य कास्टिंग (सी #)

मैं मूल रूप से यह एक प्रकार से पारित इस सामान्य समारोह लेखन में सभी उत्साहित जब संकलक एक त्रुटि फेंक दिया गया था जब मैं इसे कहते हैं, और इसके बारे में सभी नियंत्रण के लिए देखो उस प्रकार। पर l.Add((T)ctrl);

private List<T> RecurseTypes<T>(Control ctrls) 
    { 
     var l = new List<T>(); 
     foreach (var ctrl in ctrls.Controls) 
      if (ctrl.GetType() is T) 
       l.Add((T)ctrl); 
     return l; 
    } 

Am मैं कुछ कमी या मैं सिर्फ भाग्य से बाहर कर रहा हूँ त्रुटि तब होती है?

+0

कहाँ टी से आ रहा है के भंडारण के नियंत्रण हो जाएगा। मुझे कक्षा घोषणा देखने दो। –

+0

@ जेनिस: यह कक्षा से नहीं आ रहा है, यह एक सामान्य * विधि * है: 'रिकर्स टाइप '। – Ani

+0

क्या लाइन अपवाद फेंकता है? – Nickolodeon

उत्तर

13
private List<T> RecurseTypes<T>(Control parent) where T: Control 
{ 
    var l = new List<T>(); 
    foreach (var child in parent.Controls) 
     if (child is T) 
      l.Add((T)child); 
    return l; 
} 

2 परिवर्तन:

  • एक where T : Control सामान्य बाधा जोड़ने
  • is उपयोग देखें (नियंत्रण एक T हो सकता है लेकिन GetType() रिटर्न Type, जो है कभी नहीं एक Control)

इसके अलावा, ध्यान दें कि यह वास्तव में रिकर्स नहीं करता है; यह सिर्फ हो सकता है:

return ctrl.Controls.OfType<T>().ToList(); 
+0

@ एसएसएस - नहीं, मुझे ऐसा नहीं लगता है।ऐसा लगता है जैसे @maxp किसी विशेष प्रकार के * बच्चे * नियंत्रण के बाद होता है; इसका मतलब यह नहीं है कि * पैरेंट * नियंत्रण होना चाहिए। उदाहरण के लिए, 'पैनल' के अंदर सभी 'टेक्स्टबॉक्स' नियंत्रण; 'टी = टेक्स्टबॉक्स ',' ctrl' एक' पैनल 'है (' टेक्स्टबॉक्स 'नहीं)। –

+0

@ssg यह होना आवश्यक नहीं है। कारण यह है कि सूची में जा रहे आइटम उनके प्रकार के पैरामीटर के लिए चेक किए जाते हैं, केवल नियंत्रण होने की आवश्यकता होती है। यह एक ही विशिष्ट प्रकार नहीं होना चाहिए क्योंकि टी –

+0

@ चबासिटी अच्छी जगह है! अगर मैं अद्यतन करता हूं तो दिमाग? –

0

क्या आप हमें और विवरण दे सकते हैं? एक बाधा तुम्हारी मदद करेगा लाना

private List<T> RecurseTypes<T>(Control ctrl) 
    { 
     List<T> l = new List<T>(); 
     foreach (var ctrls in ctrl.Controls) 
     { 
      if (ctrls is T) 
       l.Add((T)ctrls); 
     } 
     return l; 
    } 
+0

क्योंकि यह एक कंपाइलर त्रुटि का कारण बनता है: त्रुटि प्रकार 'Foo.Control' को 'T' में परिवर्तित नहीं कर सकता –

0

:

क्यों कोड का पालन नहीं कर।

private List<T> RecurseTypes<T>(Control ctrls) where T : System.Web.UI.Control 
2

आप .NET 3.5 उपयोग कर रहे हैं या बाद में, आप अपने खुद लिखने की बजाय OfType<T>() या Cast<T>() विस्तार विधि का उपयोग कर सकते हैं।

OfType<T>() प्रारंभिक संग्रह है कि डाली जा करने में सक्षम थे के एक सबसेट वापस आ जाएगी, जबकि Cast<T>() पूरे इच्छित प्रकार के लिए डाली संग्रह वापस आ जाएगी, लेकिन अगर संग्रह में तत्वों में से एक डाली नहीं किया जा सका एक अपवाद फेंक होगा ।

0

शायद टी वांछित नियंत्रण का प्रकार नहीं है।

मेरा मतलब है कि आप यह सुनिश्चित नहीं करते हैं कि आप नियंत्रण से टी तक कास्टिंग कर रहे हैं जहां टी है ??? नियंत्रण से विरासत।

private List<T> RecurseTypes<T>(Control ctrls) where T : Control 

उसके बाद, आप जानते हुए भी के लिए एक सुराग नहीं है, तो दोहराया नियंत्रण टी आप अगर यह नियंत्रण का एक उपवर्ग है जांच करने की आवश्यकता हैं:

पहली बात आप की जरूरत एक सामान्य बाधा जोड़ने है:

if (ctrl.GetType().IsSubclassOf(typeof(Control)) 

अंत में, आप अब नियंत्रण की उस सूची मान सकते हैं प्रकार टी

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