[C#] ExpandoObject et propriétés dynamiques
Dans une api, j’ai dû faire face à une problématique qui était de retourner des objets ayant des noms de propriétés dynamiques. L’idée est que le client me demande les propriétés qu’il souhaite et l’api doit lui retourner un objet ayant ces mêmes noms de propriétés avec les bonnes valeurs associées.
Pour ce faire, j’ai découvert l’objet Expando, basé sur les types dynamic, mais comment ça fonctionne ?
ExpandoObject
Expando est utilisé pour créer des objets ayant des propriétés dynamiques. En voici un exemple :
dynamic player = new ExpandoObject(); player.FirstName = "Teddy"; player.LastName = "Desmas"; player.FinishedGame = false; player.Score = new ExpandoObject(); player.Score.Goal = 12; player.Score.Points = 4251;
On voit ici que je crée un objet player avec plusieurs propriétés (FirstName, LastName, Score …) et des valeurs de différents types. On peut également imbriquer l’utilisation d’ExpandoObject, si besoin est.
Cependant, cette méthode ne suffit pas à résoudre mon problème, car j’ai des noms de propriétés dynamiques. Ainsi, pour effectuer cela, on va utiliser ce sur quoi est basé l’ExpandoObject, un dictionnaire.
dynamic player = new ExpandoObject(); IDictionary<string, object> playerDictionary = (IDictionary<string, object>)player; playerDictionary.Add("FirstName", "Teddy"); playerDictionary.Add("LastName", "Desmas"); playerDictionary.Add("FinishedGame", false); dynamic score = new ExpandoObject(); score.Goal = 12; score.Points = 4251; playerDictionary.Add("Score", score);
Je crée exactement le même objet player avec les mêmes propriétés, mais cette fois-ci je ne le connais pas à l’avance.
Dans mon cas je passe par des clés de mapping qui me permettent de savoir quelle propriété demandée par le client est égale à quelle donnée. Et je lui renvoie sous la forme qu’il a demandé.
Pour ensuite retourner les objets au client, rien de plus simple avec le format Json et la méthode JsonConvert de Newtonsoft, qui transforme les objets Expando pour qu’ils soient utilisés par du Javascript par exemple.
{"FirstName":"Teddy","LastName":"Desmas","FinishedGame":false,"Score":{"Goal":12,"Points":4251}}
Cette classe peut être très utile dans certains cas. Cependant si vous connaissez les propriétés, utilisez une classe prédéfinie car l’utilisation de ce type d’objet peut fortement ralentir votre application. Il faut également faire attention (surtout dans le cas du dictionnaire), que le nom de vos propriétés soit valide (sans espace, …), et que vous ne les ajoutiez pas plusieurs fois (ça reste un dictionnaire).
Commentaires