Hello,
Sur un petit projet en C#, je dispose, à l’intérieur d’une classe, d’un dictionnaire défini comme ceci :
public Dictionary<string, int> Wish { get; set; } = new();
La clé est une chaîne de caractères et la valeur est un entier.
Je dispose également dans cette classe d’une méthode statique qui s’appelle normalize
et qui modifie la valeur de ma clé avant que je n’ajoute un nouvel élément dans mon dictionnaire.
Je cherche un moyen de rendre l’appel à cette méthode systématique dès que j’utilise Wish.Add
de façon à éviter de devoir l’écrire à chaque ajout et donc potentiellement l’oublier et avoir un problème de cohérence des données.
Actuellement, je n’ai trouvé qu’une solution que je trouve plutôt bancale : il s’agit d’encapsuler mon objet wish dans une classe WishDictionary
qui redéfinit la méthode Add
en faisant appel à normalize
puis à la méthode Add
du type Dictionary
:
private class WishDictionary
{
private Dictionary<string, int> wish = new();
public void Add (string key, int value)
{
wish.Add(normalize(key), value);
}
}
Le problème c’est que je dois aussi redéfinir toutes les autres méthodes auxquelles je veux recourir et ce n’est pas pratique du tout.
J’ai essayé de créer un classe qui hérite de Dictionary
et qui modifie le comportement de Add
mais je n’y arrive pas parce que ma méthode normalize
attend une chaîne de caractères alors qu’au moment de la définition, la clé de mon dictionnaire est un type générique, et visiblement C# n’aime pas beaucoup le transtypage dans ce cas :
private class WishDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public new void Add (TKey key, TValue value)
{
if (value is string)
value = normalize(value);
base.Add(key, value);
}
}
Le compilateur est tout malheureux quand je tente un truc du style. CS0030: Impossible de convertir le type 'string' en 'TValue'
Si vous avez des idées pour faire ça mieux et plus proprement je suis volontiers preneur.
Merci !