Une autre nouveauté de C#4 est le mot clé dynamic. Beaucoup d’exemple sont déjà disponible, cet exemple permet de créer une classe de manière dynamique.
La première chose à faire est de créé un objet ExpandoObject . Pour ce faire nous allons créer une classe MyClass dynamique de la sorte :
1: dynamic MyClass = new ExpandoObject();
Maintenant nous pouvons ajouter des propriétés et des méthodes, ajoutons deux propriétés : prenom et nom :
1: MyClass.nom="Mon nom";
2: MyClass.prenom="Mon prenom";
Inutile de chercher l’IntelliSense dans ce cas car la classe est générée de manière dynamique.
Nous pouvons accéder à ces propriétés comme on le fait avec des classes normales mais sans l’IntelliSense je me répète :)
Imaginons maintenant une méthode qui va créé cette classe :
1: static void CreateDynamicClass()
2: {
3: dynamic MyClass=new ExpandoObject();
4: MyClass.nom="";
5: MyClass.prenom="";
6: }
Ajoutons une méthode à cette classe, une méthode qui permet d’afficher les nom et prenom, cette fois nous devons faire appel aux delegates donc créons une méthode PrintPersonne(string prenom,string nom)
1: static void PrintPersonne(string prenom,string nom)
2: {
3: Console.WriteLine("{0} {1}",prenom,nom);
4: }
Maintenant déclarons le delegate :
1: delegate void PrintPersonne(string prenom,string nom);
Maintenant dans notre classe dynamique ajoutons ceci :
1: MyClass.Print=new Action(()=>PrintPersonne(MyClass.prenom,MyClass.nom));
Ce qui nous donne au final :
1: static void CreateDynamicClass()
2: {
3: dynamic MyClass=new ExpandoObject();
4: MyClass.nom="test";
5: MyClass.prenom="testj";
6:
7: MyClass.Print = new Action(() => PrintPersonne(MyClass.prenom, MyClass.nom));
8:
9: MyClass.Print();
10: }
MyClass.Print() permet de tester la méthode, certes cet exposé n’a pas pour but de plonger dans les entrailles de dynamic et de la DLR mais j’espère qu’il servira à certain(s)(es) pour démystifier la chose :)
PS : il aurait été aussi possible d’utiliser des méthodes anonymes etc.
ex:
1: MyClass.Print=new Action(()=>{
2: Console.WriteLine("ca fonctionne");
3: }
4: );
J’espère que ca vous aidera à vous mettre le pied à l’étrier ;)