2010-08-05 17 views
5

Llamo a una función que devuelve un objeto y en determinadas circunstancias este objeto será una lista.Obtener el recuento de una lista de tipo desconocido

Un GetType en este objeto me da fuerzas:

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

o

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

etc

No me importa lo que este tipo es, todo lo que quiero es un conde.

que he probado:

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

pero esto me da una AmbiguousMatchException que no puedo parecer a moverse sin conocer el tipo.

He tratado de fundición a IList pero consigo:

No se puede convertir objeto de tipo 'System.Collections.Generic.List'1 [ClassN]' al tipo 'System.Collections.Generic.IList' 1 [System.Object] '.

ACTUALIZACIÓN

Marcs respuesta a continuación es realmente correcto. La razón por la que no funcionaba para mí es que tengo:

using System.Collections.Generic; 

en la parte superior de mi archivo. Esto significa que siempre estaba usando las versiones genéricas de IList e ICollection. Si especifico System.Collections.IList, esto funciona bien.

Respuesta

7

moldeada a ICollection y el uso que .Count

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

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

¿No sigo necesitando un tipo sin embargo? –

+0

Tal vez estoy haciendo algo mal, pero esto me da: Error 1 \t \t El uso del tipo genérico 'System.Collections.Generic.ICollection ' requiere '1' argumentos de tipo –

+0

@ Chris, lista implementa directamente ICollection (no genérico) que tiene una propiedad '.Count'. No se requiere tipo. Se agregó código de muestra para mayor claridad. – Marc

0

Uso GetProperty en lugar de GetMethod

+0

esto devuelve un nulo –

3

usted puede hacer esto

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

asumiendo que usted quiere hacer esto a través de la reflexión que es.

+0

Me gusta esto, pero esto solo funciona cuando la lista en realidad _es_ un tipo de colección ICollection. No creo que este sea siempre el caso en la pregunta del OP. – Marc

+0

Es cierto que es un poco difícil de decir, pero dado que los ejemplos son ambos 'List ' esto funciona para los casos dados. Sin embargo, mirando la respuesta aceptada parece que no hay realmente ninguna razón para usar la reflexión en este caso. Si no se necesita reflexión, es mucho más fácil simplemente lanzar al tipo apropiado. –

+0

no funcionó para mí: "Usar el tipo genérico 'ICollection ' requiere 1 tipo de argumentos" –

0

Usted puede hacer esto

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