2011-12-22 14 views
7

मैं एक वीबी.नेट आवेदन कोडिंग कर रहा हूं जो संग्रह प्रकार से भारी सौदे करता है। नीचे दिए गए कोड को देखें:वीबी.नेट में टाइपपीफ के लिए समकक्ष या वर्कअराउंड क्या है?

Dim sub_Collection As System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

मुझे उपरोक्त रेखा को कई बार टाइप करना होगा। अगर मैंने संग्रह प्रकार बदल दिया है, तो मुझे सभी उदाहरणों के लिए बदलाव करना होगा। तो अगर "टाइपेडफ समकक्ष" का उपयोग करने का कोई तरीका है, तो मैं इन सभी समस्याओं से छुटकारा पा सकता हूं। मैंने आयात के साथ प्रयास किया, लेकिन यह केवल नामस्थानों के लिए है और इसका उपयोग कक्षाओं के लिए नहीं किया जा सकता है। किसी भी मदद हाथ की सराहना की जाएगी।

नोट: मैं वीबी 2008, विंडोज एक्सपी का उपयोग कर रहा हूं। एप्लिकेशन प्रकार विंडोज फॉर्म (वीबी) है।

संपादित करें: मैंने कोड_ग्री के नीचे दिए गए उत्तर के आधार पर कुछ प्रयास किए हैं।

यह पहला प्रयास है।

Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill)) 
Structure WaterBill 
... 
... 
End Structure 

मैं

Error:Type 'WaterBill' is not defined. 

के रूप में त्रुटि मिली यह कोशिश कर रहा है 2.

Structure WaterBill 
... 
... 
End Structure 
Imports dictionary_WaterBill = System.Collections.Generic.Dictionary(Of String,  
System.Collections.ObjectModel.Collection(Of WaterBill)) 

मैं के रूप में

Error:'Imports' statements must precede any declarations. 

किसी त्रुटि मिली एक प्रकाश डाला करने के लिए स्वागत है इस विषय पर।

+0

चीजों में से एक जो मैं वास्तव में, वास्तव में नफरत करता हूं। नेट टाइपिफ की अनुपस्थिति है। क्षमा करें - लेकिन मुझे लगता है कि आपका उत्तर "नहीं" है ... :( – paulsm4

+1

मैं कई वर्षों से .NET कोड लिख रहा हूं और मुझे कभी भी टाइप नहीं किया गया था या किसी टाइपिफ़ को चाहिए था। हम में से एक को कुछ गलत करना होगा। –

+0

इनमें से एक चीजें जो वास्तव में, वास्तव में पास्कल के बारे में पसंद करती हैं, इसकी टाइप सिस्टम है। सी/सी ++ टाइपपीफ की तुलना में पीला है। मुझे लगता है। नेट का जवाब "इसे कक्षा में लपेटो" है। अगर ऐसा है - वह बेकार है। प्रभाकरन का "संग्रह" एक उत्कृष्ट है उदाहरण क्यों। IMHO ... PS: सिर्फ इसलिए कि आप वर्षों से हथौड़ा के साथ शिकंजा का उपयोग कर रहे हैं इसका मतलब यह नहीं है कि आपको एक स्क्रूड्राइवर से लाभ नहीं होगा :) – paulsm4

उत्तर

2

सरल समाधान केवल आपके द्वारा उपयोग किए जा रहे दो नामस्थानों के लिए Imports statement जोड़ने के लिए है। बल्ले से बाहर, जो आपके लंबे प्रकार के पहचानकर्ताओं में से आधे को समाप्त करता है।

अपने कोड फ़ाइल के शीर्ष पर, जगह लाइनों:

Dim sub_Collection As Dictionary(Of String, Collection) 

मैं इस दृष्टिकोण की सलाह देते हैं, क्योंकि यह अभी भी उपयोग करता है:

Imports System.Collections 
Imports System.Collections.Generic 
Imports System.Collections.ObjectModel 

और फिर अपने घोषणा करने के लिए बदला जा सकता है मानक नाम, जो आपके प्रोग्राम को अन्य प्रोग्रामर के लिए पढ़ने में आसान रखता है।


विकल्प एक उपनाम घोषित करने के लिए एक Imports कथन का उपयोग करने के लिए है। कुछ की तरह:

Imports GenericDict = System.Collections.Generic.Dictionary(Of String, 
          System.Collections.ObjectModel.Collection) 

और फिर आप के लिए अपने घोषणापत्र को बदल सकता है: आदेश संकलित करने के लिए इन नमूनों में से किसी प्राप्त करने के लिए

Dim sub_Collection As GenericDict 


*** वैसे,, तो आपको Collection, जैसे Collection(Of String) के लिए एक प्रकार निर्दिष्ट करने के लिए।

+1

मुख्य समस्या शब्दकोश है। यह पैरामीटर की घोषणा की मांग करता है। आपको स्पष्ट रूप से शब्दकोश (स्ट्रिंग, सिस्टम। कोलेक्शन .etc.Collections) की तरह कहना होगा। मुझे कुछ अन्य संग्रहों के लिए डिक्शनरीज घोषित करना होगा। – prabhakaran

+0

क्यू: इसके अलावा, "MyDictionary = System.Collections.Generic.Dictionary आयात नहीं करेगा (स्ट्रिंग, सिस्टम। चयन। ऑब्जेक्टमोडेल.कोलेक्शन)" को उपरोक्त उपयोग करने के लिए हर स्रोत मॉड्यूल में दोहराया जाना चाहिए? – paulsm4

+0

@ paulsm4 - हां। –

2

कोई सामग्री के साथ एक विरासत वर्ग बनाएँ:

Class WaterBillDictionary 
    Inherits System.Collections.Generic.Dictionary(Of String, System.Collections.ObjectModel.Collection(Of WaterBill)) 
End Class 

Structure WaterBill 
    ... 
End Structure 

आप एक विशेष निर्माता चाहते हैं, आप एक आवरण है जो मानदंडों को स्वीकार करता है और उन्हें आधार निर्माता के पास लिखने के लिए होगा। उदाहरण के लिए:

Public Sub New() 
    MyBase.New() 
End Sub 

Public Sub New(capacity As Integer) 
    MyBase.New(capacity) 
End Sub 

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

+2

यह ध्यान देने योग्य है कि विरासत वर्ग आधार के लिए प्रतिस्थापन योग्य होगा, जबकि बेस क्लास व्युत्पन्न कक्षा में न तो प्रतिस्थापन योग्य और न ही जा सकने योग्य * होगा। – supercat

+0

बेशक - विरासत की मूल अवधारणा है .. कुछ हद तक कहने की जरूरत नहीं है – specializt

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