Modifier une valeur avant ajout dans un dictionnaire

D'une façon systématique et propre

Le problème exposé dans ce sujet a été résolu.

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 !

+0 -0

Je connais pas bien le C#, mais si c’est possible ton problème de template se résout en héritant d’une version spécialisé Dictionary:

private class WishDictionary<TValue> : Dictionary<string, TValue>
{
    public new void Add (string key, TValue value)
    {
        base.Add(normalize(key), value);
    }
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte