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);
}
}
}