using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Developpez.Dotnet.Properties; namespace Developpez.Dotnet.Collections { /// /// Représente un dictionnaire en lecture seule, qui encapsule un autre dictionnaire /// /// Type de la clé /// Type de la valeur public class ReadOnlyDictionary : DictionaryBase, IDictionary { /// /// Initialise une nouvelle instance de ReadOnlyDictionary<TKey, TValue>. /// public ReadOnlyDictionary() : base(new Dictionary()) { } /// /// Initialise une nouvelle instance de ReadOnlyDictionary<TKey, TValue> /// /// Le dictionnaire à encapsuler public ReadOnlyDictionary(IDictionary dictionary) : base(dictionary) { } /// /// Initialise une nouvelle instance de ReadOnlyDictionary<TKey, TValue>, en copiant éventuellement les données du dictionnaire original /// /// Le dictionnaire à encapsuler ou copier /// true pour réaliser une copie du dictionnaire original ; false pour simplement l'encapsuler. public ReadOnlyDictionary(IDictionary dictionary, bool copy) : base(dictionary, copy) { } /// /// L'appel de cette méthode correspond à une opération illégale /// et lève une NotSupportedException. /// /// Clé à ajouter /// Valeur à ajotuer public override void Add(TKey key, TValue value) { throw ReadOnlyException(); } /// /// L'appel de cette méthode correspond à une opération illégale /// et lève une NotSupportedException. /// /// Clé à supprimer /// true si l'élément a été supprimé, false sinon public override bool Remove(TKey key) { throw ReadOnlyException(); } /// /// Obtient la valeur correspondant à la clé spécifiée /// /// La clé pour laquelle on veut obtenir la valeur /// La valeur correspondant à la clé public override TValue this[TKey key] { get { return base[key]; } set { throw ReadOnlyException(); } } /// /// L'appel de cette méthode correspond à une opération illégale /// et lève une NotSupportedException. /// public override void Clear() { throw ReadOnlyException(); } /// /// Obtient une valeur indiquant si le dictionnaire est en lecture seule. Renvoie toujours true. /// public override bool IsReadOnly { get { return true; } } /// /// L'appel de cette méthode correspond à une opération illégale /// et lève une NotSupportedException. /// /// L'élément à ajouter public override void Add(KeyValuePair item) { throw ReadOnlyException(); } /// /// L'appel de cette méthode correspond à une opération illégale /// et lève une NotSupportedException. /// /// La paire clé/valeur à supprimer /// true si l'élément a été supprimé, false sinon public override bool Remove(KeyValuePair item) { throw ReadOnlyException(); } private static Exception ReadOnlyException() { return new NotSupportedException(ExceptionMessages.DictionaryIsReadOnly); } /// /// Crée une nouvelle instance de ReadOnlyDictionary<TKey, TValue> à partir d'un dictionnaire non générique. /// Les données sont copiées à partir du dictionnaire d'origine. /// /// le dictionnaire d'origine /// Une instance de ReadOnlyDictionary<TKey, TValue> créée à partir du dictionnaire non générique spécifié /// Les données du dictionnaire d'origine ne correspondent pas aux paramètres de type générique spécifiés public static ReadOnlyDictionary FromNonGenericDictionary(IDictionary dictionary) { var dic = dictionary .Cast() .ToDictionary( e => (TKey)e.Key, e => (TValue)e.Value); return new ReadOnlyDictionary(dic); } } }