2011-08-12 17 views
7

मेरे पास एक DICOM शब्दकोश है जिसमें डेटा एलीमेंट से प्राप्त ऑब्जेक्ट्स का एक सेट होता है। शब्दकोश में एक कुंजी के रूप में int है, और DataElement संपत्ति के रूप में है।क्या मेरे पास यह सामान्य [] संपत्ति हो सकती है?

public class DicomDictionary 
{ 
    Dictionary<int, DataElement> myElements = new Dictionary<int, DataElement>(); 
    . 
    . 
    public DataElement this[int DataElementTag] 
    { 
    get 
    { 
     return myElements[int]; 
    } 
    } 
} 

अब एक समस्या यह है कि मैं अलग DataElement प्रकार सभी DataElementSQ, DataElementOB तरह DataElement से पाने, और इतने पर है: मेरे DICOM शब्दकोश एक इस [] संपत्ति जहां मैं DataElement उपयोग कर सकते हैं, इस तरह होता है।

public T this<T>[int DataElementTag] where T : DataElement 
{ 
    get 
    { 
     return myElements[int]; 
    } 
} 

लेकिन यह वास्तव में संभव नहीं है: क्या मैं अब करना चाहता था सी # एक छोटा सा आसान में लेखन बनाने के लिए निम्नलिखित है। क्या मुझे कुछ याद आया है? बेशक मैं इसे गेटटर विधि के साथ कर सकता हूं, लेकिन यह इस तरह से होना बहुत अच्छा होगा।

+1

आपके पास जेनेरिक गुण नहीं हो सकते (इंडेक्सर्स समेत) http://stackoverflow.com/questions/494827/why-it-is-not-posible-to-define-generic-indexers-in-net –

+0

चाहे आप इसे मानते हों या नहीं, आप जो सुझाव दे रहे हैं वह भ्रमित होगा उपयोग और पढ़ने के लिए, आईएमओ। – Marc

उत्तर

3

इसके बजाय असली जेनेरिक विधि GetDataElement<T> where T : DataElement का उपयोग क्यों नहीं करें? जेनेरिक इंडेक्सर्स सी # में समर्थित नहीं हैं। आप इस मामले में क्यों सोचते हैं कि एक सूचकांक एक विधि से बेहतर है?

+0

हाय डैनी, यही मेरी अपेक्षा है। गेटटर विधि रखने की समस्या, और वास्तव में आंतरिक रूप से मेरे पास ऐसी विधि है कि यह कोड को इस छोटी-छोटी विधि के रूप में रखने के बाद और अधिक अपठनीय बनाता है। बेशक अगर मुझे इसे डालना है, तो यह भी मामला नहीं है। यही कारण है कि मैं ऐसी चीज की तलाश में था। वर्तमान में मैं इसके साथ रह सकता हूं, लेकिन यह सवाल मेरे दिमाग में आया। – msedi

4

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

+0

हाय रीड, आप सही हैं कि मैं एक सामान्य वर्ग बना सकता हूं, लेकिन मैं ऐसा कुछ करने की कोशिश नहीं कर रहा था, क्योंकि वर्तमान में यह सामान्य वर्ग के बिना काम कर रहा है। – msedi

+0

@msedi: समस्या का एक हिस्सा, जो आप दिखा रहे हैं, यह है कि शब्दकोश में कई प्रकार हो सकते हैं - आपके पास अपने वर्तमान कोड में टाइप सुरक्षा की गारंटी देने का कोई तरीका नहीं होगा (भले ही यह काम करता हो)। ऐसा कहा जा रहा है, सी # spec इसका समर्थन नहीं करता है ... –

+0

@msedi: यदि वर्ग खुद को नहीं जानता कि इंडेक्सर को किस प्रकार वापस करना चाहिए तो क्या करता है? यह कॉलर के प्रकार के बारे में जानने के लिए खराब डिजाइन होगा, न कि वर्ग। तो आपका उपयोग मामला वास्तव में क्या है? क्या आपको इस वर्ग के उदाहरण मिलेंगे जिनके पास केवल एक ही उप प्रकार है? या क्या आप उपप्रकारों का मिश्रण करने और कॉलिंग कोड पर भरोसा करने की उम्मीद कर रहे थे ताकि यह पता चल सके कि यह किस प्रकार से निकल रहा है? आपका डिजाइन इस समय थोड़ा अजीब लगता है ... – Chris

2

क्या यह आपके लिए मामला है?

public class DicomDictionary<TElement> 
{ 
     Dictionary<int, TElement> myElements = new Dictionary<int, TElement>(); 
     public TElement this[int DataElementTag] 
     {  
       get  
       {  
       return myElements[int];  
       } 
     } 
} 
+0

हाय स्लेव, शायद मुझे इसके बारे में सोचना होगा। मैं देखता हूं कि कोई दूसरा रास्ता नहीं है, जैसा कि आपने सुझाव दिया है, मुझे इसे करना चाहिए। – msedi

+0

आप ..() विधि के साथ क्यों नहीं रह सकते हैं, यह अधिक स्पष्ट है – sll

0

SLL जवाब के लिए संलग्न है:

public class Acessor<TKey, TValue> 
    where TKey : IComparable 
    where TValue : class 
{ 
    Dictionary<TKey, TValue> myElements = new Dictionary<TKey, TValue>(); 

    public TValue this[TKey key] 
    { 
     get 
     { 
      return myElements[key]; 
     } 
     set 
     { 
      myElements.Add(key, value); 
     } 
    } 
} 

या बिना कक्षा हस्ताक्षर बदलने के लिए:

public class Acessor 
{ 
    Dictionary<string, object> myElements = new Dictionary<string, object>(); 

    public object this[string key] 
    { 
     get 
     { 
      return myElements[key]; 
     } 
     set 
     { 
      myElements.Add(key, value); 
     } 
    } 
} 

और सामान्य प्रकार के लिए पार्स करने के लिए एक विधि बनाने के लिए:

public T Get<T>(string key) 
     where T : class 
    { 
     return (T)Convert.ChangeType(acessor[key], typeof(T)); 
    } 
+0

आप अपने दूसरे कोड स्निपेट में 'ऑब्जेक्ट' का उपयोग क्यों कर रहे हैं?यह 'डेटाइलेमेंट' का उपयोग करने वाले मूल व्यक्ति की तुलना में हर तरह से बदतर लगता है ... – Chris

+0

मैंने सामान्य उपयोग के लिए 'ऑब्जेक्ट' का उपयोग किया –

+0

पर्याप्त स्पष्ट नहीं है। – nyedidikeke

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

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