Quelque chose m'a pris par surprise en regardant la dynamique C # aujourd'hui (je ne les ai jamais beaucoup utilisées, mais récemment j'ai expérimenté avec le framework web Nancy). J'ai trouvé que je ne pouvais pas faire ça:
dynamic expando = new ExpandoObject();
expando.name = "John";
Console.WriteLine(expando["name"]);
La dernière ligne lève une exception:
Impossible d'appliquer l'indexation avec [] à une expression de type 'System.Dynamic.ExpandoObject'
Je comprends le message d'erreur, mais je ne comprends pas pourquoi cela se produit. J'ai regardé la documentation pour ExpandoObject et elle implémente explicitement IDictionary<,>
et a donc un this.[index]
méthode ( MSDN ). Pourquoi ne puis-je pas l'appeler?
Bien sûr, rien ne m'empêche de downcaster manuellement le ExpandoObject
dans un dictionnaire puis de l'indexer, mais ce genre de méthode défie le point; il n'explique pas non plus comment Expando a pu masquer la méthode de l'une de ses interfaces.
Que se passe t-il ici?
comment Expando a pu cacher la méthode d'une de ses interfaces.
Parce que, comme vous l'avez correctement découvert dans la documentation, le l'indexeur est an implémentation d'interface explicite . De Tutoriel d'implémentation d'interface explicite :
Une classe qui implémente une interface peut implémenter explicitement un membre de cette interface. Lorsqu'un membre est implémenté explicitement, il n'est pas accessible via une instance de classe, mais uniquement via une instance de l'interface.
Cela signifie que vous devrez convertir la référence à l'interface pour y accéder:
((IDictionary<String, Object>)expando)["name"]