2010-11-12 5 views
4

J'ai eu l'idée astucieuse d'utiliser une variable dynamique pour tester les résultats d'une méthode qui retourne un type anonyme - plus précisément, il retourne un JsonResult, qui ressemble à json ceComment lire les propriétés de types anonymes en utilisant la variable "dynamique"

{ "newData" : [ 1120741.2697475906, 
     826527.64681837813 
    ], 
    "oldData" : [ 1849870.2326665826, 
     1763440.5884212805 
    ], 
    "timeSteps" : [ 0, 
     4.8828124999999998e-10 
    ], 
    "total" : 2 
} 

Je peux lire le JSonResult qui me donnera le type anonyme. Voici mon code:

var jsonResult = controller.GetChangeData(1) as JsonResult; 
dynamic data = jsonResult.Data; 
Assert.AreEqual(2, data.total); // This works fine :) 

Mais comment obtenir à "newData" par exemple? Ce code ....

var newData = data.newData; 

Donne-moi une System.Linq.Enumerable.WhereSelectArrayIterator, mais je ne sais pas quoi faire avec elle pour pouvoir utiliser simplement comme un Arry de doubles.

J'ai essayé de le lancer en double [], mais ça ne marche pas non plus. En aparté, est-ce que je peux facilement vérifier si une propriété est définie sur la dynamique?

+0

Que se passe-t-il lorsque vous essayez cette 'data.newData.ToArray()'? –

+0

var data2 = data.newData.ToArray(); ---> 'object' ne contient pas de définition pour 'ToArray' (essayé aussi avec certains moulages) –

Répondre

3

La raison pour laquelle .ToArray() ne fonctionne pas est qu'il s'agit d'une méthode d'extension et que les méthodes d'extension ne sont pas disponibles au moment de l'exécution. Cela signifie simplement que vous devez appeler la fonction de manière statique. Est-ce que Enumerable.ToArray<double>(data.newData) fonctionne?

Vous aurez peut-être besoin de Enumerable.ToArray(Enumerable.Cast<double>(data.newData)) en fonction des éléments dont dispose actuellement le newData.

+0

Oui! Enumerable.ToArray (data.newData) fait le travail pour moi :) Merci –

2

Pour obtenir les propriétés d'une instance d'un type dynamique

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(dyn); 
foreach (PropertyDescriptor prop in props) 
{ 
    object val = prop.GetValue(dyn); 
    var propName = prop.Name; 
    var propValue = val; 
} 

où dyn est une instance d'un objet dynamique.

+0

C'était une copie utile + un nugget de code, que je suis sûr que je vais devenir une méthode d'extension au travail ... –

1

Pourriez-vous utiliser la classe JavaScriptSerializer pour analyser la chaîne JSON dans une variable dynamique? Par exemple:

var serializer = new JavaScriptSerializer(); 
var jsonObj = serializer.Deserialize<dynamic>(jsonString); 
var newData1 = jsonObj["newData"][0]; 
+0

+1 pour une réponse de travail. Le problème avec ceci est que mon json était dans un JsonResult, j'avais besoin de le sérialiser en une corde puis de le désérialiser en une dynamique, donc moins idéale. –

Questions connexes