2011-02-04 10 views
6

問題を属性。私が試したC#typedefが

ソリューション:

class Foo : Dictionary<String, String> { } 

が、私は逆シリアル化コンストラクタを作成する必要がありますし、辞書がすでに直列化復元することができたときにそれは少し愚かになるのでその仕事。

私も

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

を試みたが、それを必要とするすべてのファイルにその行を追加した場合、私は私がいること(のtypedefの半分のポイントを削除することがあります、より多くの、1つのファイルで作業するために、これを必要と私はタイプを変更する必要がある場合、私は)そう簡単に行うことができますされ

私はこれについて何ができますか?

+0

を私はそれが(ほとんど)どのような場合には、ベースのctorを呼び出すために愚かだと言うではないでしょう+それが1分の努力だので、私はそれを行うでしょうねエイリアスが必要ですか?あなたは何の問題を解決しようとしていますか? –

+0

エイリアスを必要とする一般的な理由:必要に応じてクラスを後で簡単に作ることができるように、そして人々がそれを間違ったタイプの辞書として扱おうとはしないようにします。編集:また、私は文字列以外のものに簡単にキーや値を変更する必要がある場合は、その簡単です。 – Drew

+0

これは 'BinaryFormatter'シリアル化ですか?それとも? –

答えて

6

エイリアスのアプローチ属性は保存されていますが、オーバーヘッドが大きすぎます(ファイルごとなど)。

タイプレベルは属性genercally保存ある - それは、属性に依存 - [Serializable]ため、それが持っていることに注意してください。

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

Inherited = falseが重要であること - すなわち、それが継承されていません。

は個人的に私はおそらく最初の例で働いて直列化のctor /コールバックを得ることに集中しているだろう - 私はそれがはるかに多くの努力を必要としていることはないだろう。以下は罰金だ:

[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) { } 
} 

はしかし、ここでカプセル化を介した代替です:「辞書は、すでに直列化復元することができたときに少し愚かなことでしょう」

[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

うーんなぜ...

[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) 
    { 
    } 

}