2011-02-04 16 views
6

समस्या को संरक्षित करता है समस्या: मेरे पास Dictionary<String, String> है कि मुझे उपनाम की आवश्यकता है, लेकिन मुझे इसे क्रमबद्ध/deserialize करने की भी आवश्यकता है।सी # टाइपिफ जो गुण

समाधान मैं कोशिश की है:

class Foo : Dictionary<String, String> { } 

लेकिन यह है कि काम क्योंकि मैं एक Deserialization निर्माता बनाना होगा और कहा कि थोड़ा पागल होगा जब शब्दकोश पहले से ही deserialized जा सकता है।

मैं भी

using Foo = System.Collections.Generic.Dictionary<String, String>; 

कोशिश की, लेकिन मैं इस की जरूरत अधिक है कि एक फ़ाइल में काम करने के लिए और अगर सभी फाइलों को इसकी जरूरत है कि में है कि लाइन जोड़ने के लिए, मैं typedefs के आधे बिंदु निकालने जा रहे हैं (कि है, अगर मुझे इस प्रकार को बदलने की ज़रूरत है, तो मैं इतना आसानी से कर सकता हूं)

मैं इसके बारे में क्या कर सकता हूं?

+0

आपको उपनाम की आवश्यकता है? आप क्या हल करने की कोशिश कर रहे हैं? –

+0

उपनामों की आवश्यकता के सामान्य कारण: यदि आवश्यकता हो तो मैं इसे आसानी से कक्षा बना सकता हूं, और इसलिए कि लोग इसे गलत प्रकार के शब्दकोश के रूप में पेश करने का प्रयास नहीं करते हैं। संपादित करें: इसके अलावा यदि मुझे एक स्ट्रिंग के अलावा किसी अन्य चीज़ में कुंजी या मान को बदलने की आवश्यकता है तो यह आसान है। – Drew

+0

क्या यह 'बाइनरीफॉर्मेटर' क्रमबद्धता है? या कौन सा? –

उत्तर

6

ऊर्फ दृष्टिकोण विशेषताओं को संरक्षित किया गया है, लेकिन आप बताते हैं कि बहुत अधिक ओवरहेड (प्रति फ़ाइल आदि) है।

प्रकार स्तरीय गुण genercally संरक्षित कर रहे हैं - लेकिन यह विशेषता पर निर्भर करता - [Serializable] के लिए, ध्यान दें यह है कि:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct 
| AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)] 

Inherited = false महत्वपूर्ण किया जा रहा है - जो कि यह विरासत में मिला नहीं है।

व्यक्तिगत रूप से शायद मैंने पहले उदाहरण में काम कर रहे सीरियलाइजेशन सीटीओआर/कॉलबैक प्राप्त करने पर ध्यान केंद्रित किया होगा - मुझे संदेह है कि इसे और अधिक प्रयास की आवश्यकता होगी। निम्नलिखित ठीक लग रहा है:

[Serializable] 
public class Foo: Dictionary<string, string> { 
    public Foo() : base() { } 
    public Foo(SerializationInfo info, StreamingContext context) : base(info, context) { } 
    public Foo(int capacity) : base(capacity) { } 
    public Foo(IEqualityComparer<string> comparer): base(comparer) {} 
    public Foo(IDictionary<string,string> dictionary) : base(dictionary) { } 
    public Foo(int capacity, IEqualityComparer<string> comparer) : base(capacity, comparer) { } 
    public Foo(IDictionary<string, string> dictionary, IEqualityComparer<string> comparer) : base(dictionary, comparer) { } 
} 

हालांकि, यहां कैप्सूलीकरण के माध्यम से एक विकल्प है: "। कि थोड़ा पागल होगा जब शब्दकोश पहले से ही deserialized जा सकता है"

[Serializable] 
public class Foo : IDictionary<string,string> 
{ 
    private readonly Dictionary<string, string> inner = new Dictionary<string, string>(); 

    public void Add(string key, string value) 
    { 
     inner.Add(key, value); 
    } 

    public bool ContainsKey(string key) 
    { 
     return inner.ContainsKey(key); 
    } 

    public ICollection<string> Keys 
    { 
     get { return inner.Keys; } 
    } 

    public bool Remove(string key) 
    { 
     return inner.Remove(key); 
    } 

    public bool TryGetValue(string key, out string value) 
    { 
     return inner.TryGetValue(key, out value); 
    } 

    public ICollection<string> Values 
    { 
     get { return inner.Values; } 
    } 

    public string this[string key] 
    { 
     get 
     { 
      return inner[key]; 
     } 
     set 
     { 
      inner[key] = value; 
     } 
    } 

    void ICollection<KeyValuePair<string, string>>.Add(KeyValuePair<string, string> item) 
    { 
     ((IDictionary<string,string>)inner).Add(item); 
    } 

    public void Clear() 
    { 
     inner.Clear(); 
    } 

    bool ICollection<KeyValuePair<string, string>>.Contains(KeyValuePair<string, string> item) 
    { 
     return ((IDictionary<string, string>)inner).Contains(item); 
    } 

    void ICollection<KeyValuePair<string, string>>.CopyTo(KeyValuePair<string, string>[] array, int arrayIndex) 
    { 
     ((IDictionary<string, string>)inner).CopyTo(array, arrayIndex); 
    } 

    public int Count 
    { 
     get { return inner.Count; } 
    } 

    bool ICollection<KeyValuePair<string, string>>.IsReadOnly 
    { 
     get { return ((IDictionary<string, string>)inner).IsReadOnly; } 
    } 

    bool ICollection<KeyValuePair<string, string>>.Remove(KeyValuePair<string, string> item) 
    { 
     return ((IDictionary<string, string>)inner).Remove(item); 
    } 

    public IEnumerator<KeyValuePair<string, string>> GetEnumerator() 
    { 
     return inner.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return inner.GetEnumerator(); 
    } 
} 
1

मम्म मैं यह (लगभग) किसी भी मामले में एक आधार ctor कॉल करने के लिए मूर्खतापूर्ण है क्यों नहीं कहेंगे + यह 1 मिनट प्रयास है, तो मैं कहना चाहता हूँ यह कर ...

[Serializable] 
public class Foo : Dictionary<string, string> 
{ 
    public Foo() 
     : base() 
    { 
    } 
    public Foo(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
    } 

} 

या

[Serializable] 
public class Foo<TKey,TValue> : Dictionary<TKey,TValue> 
{ 
    public Foo() 
     : base() 
    { 
    } 
    public Foo(SerializationInfo info, StreamingContext context) 
     : base(info, context) 
    { 
    } 

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