2010-08-05 5 views
5

J'appelle une fonction qui retourne un objet et dans certaines circonstances cet objet sera une liste.Obtenir le nombre d'une liste de type inconnu

A GetType sur cette question pourrait d'objet me donne:

{System.Collections.Generic.List`1[Class1]} 

ou

{System.Collections.Generic.List`1[Class2]} 

etc

Je me fiche de ce que ce type est tout ce que je veux est un comte.

J'ai essayé:

Object[] methodArgs=null; 
var method = typeof(Enumerable).GetMethod("Count"); 
int count = (int)method.Invoke(list, methodArgs); 

mais cela me donne une AmbiguousMatchException que je ne peux pas sembler se déplacer sans connaître le type.

J'ai essayé casting à IList mais je reçois:

Impossible de jeter l'objet de type 'System.Collections.Generic.List'1 [ClassN]' taper 'System.Collections.Generic.IList' 1 [System.Object] '.

MISE À JOUR

Marcs réponse ci-dessous est en fait correcte. La raison pour laquelle cela ne fonctionnait pas pour moi est que j'ai:

using System.Collections.Generic; 

en haut de mon dossier. Cela signifie que j'ai toujours utilisé les versions génériques de IList et ICollection. Si je spécifie System.Collections.IList alors cela fonctionne bien.

Répondre

7

Moulage à ICollection et l'utiliser .Count

List<int> list = new List<int>(Enumerable.Range(0, 100)); 

ICollection collection = list as ICollection; 
if(collection != null) 
{ 
    Console.WriteLine(collection.Count); 
} 
+2

Ne pas j'ai encore besoin d'un type bien? –

+0

peut-être que je fais quelque chose de mal, mais cela me donne: Erreur Utilisation du type générique « System.Collections.Generic.ICollection » exige « 1 » arguments de type –

+0

@ Chris, Liste implémente directement ICollection (non générique) qui a une propriété '.Count'. Aucun type requis. Ajout d'un exemple de code pour plus de clarté. – Marc

0

Utilisation GetProperty au lieu de GetMethod

+0

cela renvoie un null –

3

Vous pouvez le faire

var property = typeof(ICollection).GetProperty("Count"); 
int count = (int)property.GetValue(list, null); 

supposant que vous voulez faire via la réflexion qui est.

+0

J'aime ça, mais cela ne fonctionne que lorsque la liste est en fait un type ICollection. Je ne pense pas que ce soit toujours le cas dans la question du PO. – Marc

+0

Certes, c'est un peu difficile à dire, mais puisque les exemples donnés sont à la fois 'List ' cela fonctionne pour les cas donnés. Cependant, en regardant la réponse acceptée, il semble qu'il n'y ait vraiment aucune raison d'utiliser la réflexion dans ce cas. Si la réflexion n'est pas nécessaire, il est beaucoup plus facile de simplement passer au type approprié. –

+0

n'a pas fonctionné pour moi: "En utilisant le type générique 'ICollection ' nécessite 1 arguments de type" –

0

Vous pouvez le faire

var countMethod = typeof(Enumerable).GetMethods().Single(method => method.Name == "Count" && method.IsStatic && method.GetParameters().Length == 1); 
Questions connexes