2009-03-11 4 views
19

मेरे पास टेक्स्टबॉक्स के साथ-साथ RichTextBox के लिए एक ईवेंट हैंडलर है। कोड समान है, लेकिनGetType() का उपयोग कर ईवेंट हैंडलर में कास्ट प्रेषक ऑब्जेक्ट। नाम

# 1 हैंडलर में मैं करता हूँ:

RichTextBox tb = (RichTextBox)sender 

हैंडलर # 2 तदनुसार में:

TextBox tb = (TextBox)sender 

ऐसा करने से मैं पूरी तरह से भेजने के नियंत्रण में हेरफेर कर सकते हैं। क्या मैं जानना चाहता हूँ कि कैसे कर सकते हैं मैं अपने प्रकार का उपयोग कर

sender.GetType().Name 

और फिर रन टाइम पर नियंत्रण बना सकते हैं और इसके साथ काम के अनुसार पाठ बॉक्स या RichTextBox के लिए भेजने से वस्तु डाली है। इस तरह मैं केवल एक ईवेंट हैंडलर समारोह की जरूरत है: कम कोड, कम त्रुटियों, बनाए रखने के लिए आसान है और सूखी :-)

+0

क्या आप ऐसे पॉलिमॉर्फिक विधि या संपत्ति का उदाहरण दे सकते हैं जो दो ऐसे प्रकारों के बीच साझा किया जाता है? और अभी तक एक आम इंटरफ़ेस द्वारा खुलासा नहीं किया गया है? – AnthonyWJones

उत्तर

3

क्या गुण आप की जरूरत के आधार पर आप डाली सकता है पाठकबॉक्स के रूप में प्रेषक टेक्स्टबॉक्स और रिचटेक्स्टबॉक्स दोनों के रूप में दोनों उप-वर्ग से प्राप्त होते हैं।

+0

जो आशाजनक लग रहा है! मैं इसे आज़मा दूंगा ... – tfl

+0

उम्मीद है कि यह काम करता है (: – Kieron

4
RichTextBox textbox = sender as RichTextBox; 
if (textbox != null) 
{ 
    // do stuff as a rtb 
    textbox.Text = "I'm a rtb"; 
    return; 
} 

TextBox textbox = sender as TextBox; 
if (textbox != null) 
{ 
    // do stuff as a textbox 
    textbox.Text = "I'm a textbox"; 
} 
1

आप इस्तेमाल कर सकते हैं 'है', अगर आप सिर्फ जानना चाहता हूँ प्रकार नाम के बजाय टाइप करें और ऑब्जेक्ट संदर्भ की आवश्यकता नहीं है।

if (sender is RichTextBox) 
{ 
    // ... 
} 
else if (sender is TextBox) 
{ 
    // ... 
} 

संपादित करें:

if (sender is RichTextBox richTextBox) 
{ 
    richTextBox.Text = "I am rich"; 
} 
else if (sender is TextBox textBox) 
{ 
    textBox.Text = "I am not rich"; 
} 
+0

जो सबसे अच्छा समझौता प्रतीत होता है - धन्यवाद – tfl

+1

यह ठीक है लेकिन @Chris सुझाव बेहतर है। चूंकि आप वस्तुओं के साथ तुरंत कुछ करने जा रहे हैं, यह आपको अतिरिक्त कलाकारों को बचाएगा। –

3

कास्टिंग: सी # 7 एक अच्छा वाक्य रचना है कि आप परीक्षण करने और मूल्य इनलाइन प्राप्त करने के लिए अनुमति देता है: तथापि के रूप में एक टिप्पणी में कहा, आप आमतौर पर oobject चाहते हैं केवल संकलन-समय पर ही किया जा सकता है और इस प्रकार आपको उन प्रकारों को जानने की आवश्यकता है जिन्हें आप संकलित समय पर डालना चाहते हैं। एक रनटाइम प्रकार (जैसा कि GetType() द्वारा लौटाया गया है) कास्टिंग करते समय उपयोग नहीं किया जा सकता है।

यदि यह पॉलिमॉर्फिज्म है तो आप ढूंढ रहे हैं कि आप प्रतिबिंब के माध्यम से नाम संपत्ति तक पहुंच सकते हैं। मैं इस तरह से नहीं जाऊंगा हालांकि इवेंट हैंडलरों का पुन: उपयोग करने में सक्षम हूं।

यदि आप मजबूत टाइपिंग चाहते हैं, तो दो प्रेषकों पर एक सामान्य बेस क्लास या इंटरफ़ेस जाने का एकमात्र तरीका है।

28

आपको कभी भी डालना नहीं है। जब मैंने शुरू किया, तो मैं उसी तरह सोचता था, यह 'पैटर्न' गलत है, और वास्तव में तार्किक नहीं है। आप देखभाल करने के लिए की आवश्यकता है, कोड समान है

if (sender is TextBox) 
{ 
    TextBox tb = (TextBox)sender; 
} 
else if (sender is RichTextBox) 
{ 
    RichTextBox rtb = (RichTextBox)sender; 
} 
else 
{ 
    // etc 
} 
+1

आप ऑब्जेक्ट के प्रकार को निर्धारित करने के बाद वास्तव में कास्टिंग कर रहे हैं, इसलिए आपको * करना होगा, लेकिन यह निश्चित रूप से ऐसा करने का सही तरीका है क्योंकि यह प्रतिबिंब (धीमी) प्रतिबिंब पर निर्भर नहीं है। – idmadj

0

:

आपका सबसे अच्छा शर्त की तरह कुछ का उपयोग करने के लिए है? मुझे आश्चर्य है कि Control पर कास्टिंग आपको जो कुछ भी चाहिए उसे आपको नहीं देगा ...

एक जटिल हैंडलर कई सरल हैंडलर से बेहतर नहीं है। किसी भी तरह से, अगर आप ऐसा करना चाहते हैं है, "के रूप में"/"है" बेहतर है (यह तार आदि पर निर्भर नहीं है):

TextBox tb = sender as TextBox; 
if(tb!=null) {/* TextBox specific code */} 
... 
0

यदि आप कोड दोहराना नहीं चाहते हैं तो आप दोनों नियंत्रणों को कास्ट कर सकते हैं, सामान्य कार्यों को एक अलग विधि में दोबारा कर सकते हैं जो टेक्स्टबॉक्सबॉक्स को तर्क के रूप में लेता है। और आपके ईवेंट हैंडलर में नियंत्रण को सिस्टम में कनवर्ट करें। Windows.Forms.TextBoxBase दोनों नियंत्रणों के रूप में TexbBoxBase से व्युत्पन्न होते हैं और विधि को कॉल करते हैं।

कृपया ध्यान दें यदि आपको इनमें से किसी भी नियंत्रण के विशिष्ट गुणों की आवश्यकता है तो यह रिफैक्टरिंग काम नहीं करेगी।

6

मैं जानता हूँ कि यह एक बहुत पुरानी पोस्ट है लेकिन फ्रेमवर्क 4 में आप एक नियंत्रण के रूप में इस डाली कर सकते हैं:

Control cntrl = (Control)sender; 
cntrl.Text = "This is a " + sender.GetType().ToString(); 

नोट आप केवल नियंत्रण विभिन्न नियंत्रणों के सभी आम में है कि संदर्भित करने के लिए सक्षम हैं (यानी पाठ)। ऊपर दिए गए कोड की

0

जेनेरिक संस्करण:

CastAndUse(sender, new Action((foo) => foo = bar)); 

सही है, लेकिन काम नहीं:

public static void CastAndUse<T>(object item, Action<T> action) where T : class 
{ 
    T thing = item as T; 

    if (thing != null) 
    { 
     action(thing); 
    } 
} 

रूप में प्रयुक्त।

0

आप अपने लिए कलाकारों को संभालने के लिए इनलाइन-अस्थायी चर का भी उपयोग कर सकते हैं।

if (sender is RichTextBox tb) 
{ 
    // ... // 
} 
else if (sender is TextBox tb) 
{ 
    // ... // 
} 
संबंधित मुद्दे