63 votes

C# 4 : Exemple concret de types dynamiques

Je pense avoir à moitié compris le concept des Dynamic Types dans C# 4, mais je n'arrive pas à imaginer un scénario où je voudrais vraiment l'utiliser.

Je suis sûr qu'il y en a beaucoup, mais j'ai juste du mal à faire le lien avec la manière dont je pourrais concevoir une solution qui serait mieux résolue avec la dynamique qu'avec les interfaces, l'injection de dépendances, etc.

Alors, quel est le scénario d'une application du monde réel où l'utilisation de types dynamiques est appropriée ?

64voto

Jörg W Mittag Points 153275

Il y a beaucoup de cas où vous êtes déjà utiliser le typage dynamique et la liaison dynamique aujourd'hui . Tu ne t'en rends pas compte, parce que tout est caché derrière des ficelles. System.Object car jusqu'à C# 4, le support nécessaire n'existait pas.

Un exemple est l'interopérabilité COM : COM est en fait un système d'objets semi-dynamiques. Lorsque vous faites de l'interopérabilité COM, beaucoup de méthodes retournent en fait un objet dynamique, mais parce que C# ne les supportait pas, elles étaient retournées en tant que System.Object et vous deviez les lancer vous-même, en attrapant peut-être des exceptions en chemin.

Un autre exemple est l'interaction avec des données dynamiquement typées (ou même non typées), telles que JSON, CSV, HTML, XML sans schéma, services web sans schéma, bases de données sans schéma (qui sont, après tout, la nouvelle mode). Aujourd'hui, on utilise des chaînes de caractères pour ces éléments. Une API XML ressemblerait à

var doc = new XmlDocument("/path/to/file.xml");
var baz = doc.GetElement("foo").GetElement("qux");

et ainsi de suite. Mais qu'en est-il :

dynamic doc = new XmlDocument("/path/to/file.xml");
var baz = doc.foo.qux;

N'est-ce pas joli ?

Un troisième exemple est la réflexion. Aujourd'hui, l'invocation d'une méthode via la réflexion se fait en passant une chaîne de caractères à la commande InvokeMember (ou quel que soit le nom de cette chose). Ne serait-il pas plus agréable de, vous savez, juste invoquer cette foutue chose ?

Ensuite, il y a génération de données dynamiques (en gros, le contraire du deuxième exemple). Voici un exemple de génération d'un XML dynamique :

dynamic doc = new XmlBuilder();
doc.articles(id=42, type="List", () => {
  article(() => {
    number(42);
    title("blahblubb");});});

Ce n'est pas aussi beau que l'équivalent de Ruby, mais c'est ce que j'ai pu trouver de mieux dans un délai aussi court :-)

Et enfin, mais certainement pas le moindre, l'intégration avec un langage dynamiquement typé. Qu'il s'agisse de JavaScript dans une application Silverlight, d'un moteur de règles personnalisé intégré à votre application commerciale ou d'une instance DLR que vous hébergez dans votre programme de CAO/IDE/éditeur de texte.

3voto

Mark Byers Points 318575

Il y a un exemple sur MSDN :

De nombreuses méthodes COM permettent de varier les types d'arguments et le type de retour en désignant les types comme objets. Cela a nécessité un casting explicite des valeurs afin de les coordonner avec les variables fortement typées en C#. Si vous compilez en utilisant l'option /link (Options du compilateur C#), l'introduction du type dynamique vous permet de traiter les occurrences d'objet dans les signatures COM comme si elles étaient de type dynamique, et donc d'éviter une grande partie du casting.

Un autre exemple est celui de l'interopérabilité avec des langages dynamiques.

Il arrive également que vous souhaitiez rendre un code générique, mais que vous ne puissiez pas le faire parce que, même si les objets mettent en œuvre la même méthode, ils ne partagent pas une classe de base ou une interface appropriée qui déclare les méthodes dont vous avez besoin. Un exemple de ceci est d'essayer de rendre quelque chose de générique avec des ints et des short. C'est un peu une pirouette, mais la dynamique vous permet d'appeler les mêmes méthodes sur ces différents types, ce qui permet une meilleure réutilisation du code.

Mise à jour : Un peu de recherche ici a permis de trouver ce billet connexe .

3voto

Walter Almeida Points 157

Du blog de Walter Almeida : un scénario d'utilisation du mot-clé dynamic en C# pour améliorer l'orientation objet :

http://blog.walteralmeida.com/2010/05/using-the-dynamic-keyword-in-c-to-improve-objectorientation.html

2voto

Joel Potter Points 12759

Scott Watermasysk a écrit un article sur l'utilisation de dynamics pour le mappage clé-propriété des dictionnaires sur le pilote C# de MongoDB.

http://simpable.com/code/mongodb-dynamics/

2voto

jpierson Points 3871

Je pense que d'autres ont donné d'excellentes réponses jusqu'à présent, alors je veux juste ajouter cet exemple de David Hanson. Ce post montre l'application la plus pratique que j'ai trouvée jusqu'à présent pour les types dynamiques en C# où il les utilise pour créer des objets proxy. Dans cet exemple, il crée un proxy qui permet de lever des exceptions sur les erreurs de liaison WPF. Je ne suis pas sûr que cela puisse également être réalisé dans le cas de liaisons WPF en utilisant des CustomTypeDescriptors et des concepts de descripteurs de propriétés en général, mais quoi qu'il en soit, je pense que l'utilisation du nouveau type dynamique C# 4.0 est une excellente démonstration de ses capacités.

Lever des exceptions de liaison dans WPF et Silverlight avec .net 4.0 Dynamics

Une autre utilisation à laquelle je peux penser pour les types dynamiques est de créer des proxies qui peuvent être branchés comme un DataContext dans WPF ou dans d'autres endroits où un type d'objet générique est attendu et où les méthodes de réflexion sont normalement utilisées pour interroger le type. Dans ces cas, en particulier lors de la construction de tests, un type dynamique peut être utilisé, ce qui permettrait alors aux accesseurs de propriétés d'être appelés et enregistrés en conséquence par l'objet proxy de manière dynamique sans avoir à coder en dur les propriétés dans une classe réservée aux tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X