Comment accéder aux éléments d’une liste dynamic?

J’essaie de comprendre comment énumérer les résultats d’un LINQ dynamic. .Select(ssortingng selectors) dans .NET 4.5. System.Linq.Dynamic dynamic provient de l’espace de noms System.Linq.Dynamic .

Edit: System.Linq aussi System.Linq .

J’ai une méthode qui ressemble à ceci:

  public void SetAaData(List data, List fields) { if (data == null || data.Count == 0) { return; } var dynamicObject = data.AsQueryable().Select("new (" + ssortingng.Join(", ", fields) + ")"); _aaData = dynamicObject; } 

Si je parcoure le code, je peux examiner dynamicObject et l’énumérer pour afficher les résultats (qui sont corrects). Le problème est que j’essaie maintenant de réussir mon test unitaire et que je n’ai pu accéder à rien dans dynamicObject. Le champ _aaData est défini en tant que type dynamic .

Dans ma méthode de test, j’ai essayé ceci:

  var hasDynamicProperties = new MyClass(); dgr.SetAaData(data, fields); // data is a List Assert.IsTrue(hasDynamicProperties.AaData.Count > 0); 

Lorsque je lance ce test, j’obtiens le message d’erreur suivant:

 MyTestingClass threw exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery' does not contain a definition for 'Count' 

Alors, j’ai essayé de le jeter dans une liste:

 Assert.IsTrue(dgr.AaData.ToList().Count() > 0); 

Ce qui a entraîné l’erreur suivante:

 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Linq.EnumerableQuery' does not contain a definition for 'ToList' 

Alors, j’ai cherché System.Linq.EnumerableQuery ici: http://msdn.microsoft.com/en-us/library/cc190116.aspx . Je vois tout ce que .Count() est censé être une méthode d’extension valide, mais cela ne fonctionne pas lorsque je l’essaie. En fait, aucune des méthodes de cette page ne fonctionne lorsque je les essaie.

Qu’est-ce que je fais mal?

Les méthodes d’extension ne peuvent pas être appliquées aux objects dynamic comme s’il s’agissait de méthodes membres.

Count() est une méthode d’extension définie dans System.Linq.Queryable , vous pouvez l’appeler directement sur votre object dynamic:

 Assert.IsTrue(Queryable.Count(hasDynamicProperties.AaData) > 0)