none
New DictionaryEntry : IDE0028

    Question

  • Bonjour tout le monde,

    Aïe aïe aïe, j'ai l'impression que me voilà à poser une question de débutant.

    Je suis toujours occupé à écrire des sites WebAPI, et à faire attention au routage.

    Dans le Global.asax j'ai ça :

                RouteValueDictionary routeDict = new RouteValueDictionary();
                routeDict.Add("controller", "HelloWebAPI");
                GlobalConfiguration.Configuration.Routes.Add("default", 
                    new System.Web.Http.Routing.HttpRoute("{controller}", 
                            defaults: new System.Web.Http.Routing.HttpRouteValueDictionary(routeDict)));

    et ça marche, pas de souci, ça m'affiche bien la donnée contenue dans le contrôleur HelloWebAPI (d'ailleurs, je m'aperçois que je n'ai pas eu besoin de préciser que get est l'action par défaut).

    Seul petit hic, dans la fenêtre des erreurs j'ai le message IDE0028, "L'initialisation des collections peut être simplifiée".

    Alors j'essaie de simplifier, et c'est à ce niveau que semble-t-il je me mélange un peu les pinceaux.

    Je remplace les deux premières lignes citées par

                RouteValueDictionary routeDict = new RouteValueDictionary(new System.Collections.DictionaryEntry("controller", "HelloWebAPI"));

    avec un point d'arrêt sur la ligne suivante.

    Arrivé à ce point d'arrêt, je m'aperçois que routeDict comporte deux entrées.

    Sur la première, la clé vaut Key et la valeur vaut controller.

    Sur la deuxième, la clé vaut Value, et la valeur vaut HelloWebAPI.

    A l'exécution bien entendu la valeur par défaut ne donne rien de bon.

    J'aurais préféré avoir, comme avec la première syntaxe, une seule entrée, avec comme clef controller, et comme valeur HelloWebAPI.

    A ce qu'il me semble, DictionaryEntry a pourtant un constructeur avec en premier argument la clef, en deuxième la valeur ?

    A quel niveau se sont mélangés mes pinceaux ?

    J'ai été tenté d'ajouter new System.Collections.Dictionary entre RouteValueDictionary et DictionaryEntry, c'est l'Intellisense qui m'en a dissuadé : si je tape Dict, c'est DictionaryEntry qui est disponible, pas Dictionary.

    Je n'ai pas osé forcer ... Aurais-je eu tort ?

    **

    Un premier élément de réponse semble être que ça n'est pas évident du tout de trouver un constructeur avec des paramètres, surtout string, object, pour un objet dérivé de IDictionary. J'ai dû mal chercher, ou alors l'erreur IDE0028 est appelée à rester en l'état.

    Une solution capillotractée serait d'écrire moi-même la classe dérivée de IDictionary. Je commence quand même à avoir l'impression de sortir de l'objet du projet ...


    • Modifié Gloops mercredi 14 février 2018 16:24
    mercredi 14 février 2018 15:07

Réponses

  • Si une RouteValueDictionary fonction comme un Dictionary :

    RouteValueDictionary routeDict = new RouteValueDictionary{{"controller", "HelloWebAPI"}};


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse Gloops vendredi 16 février 2018 09:24
    jeudi 15 février 2018 13:42

Toutes les réponses