2011-04-27 6 views
5

Pregunta básica de C#. En el ejemplo de abajo, el 'es' no le gusta la variable de tipo. Cualquier idea debería ser una respuesta simple.C# Es Escriba la pregunta de la lista

List<object> list = new List<object>(); 
    list.Add("one"); 
    list.Add(2); 
    list.Add('3'); 

    Type desiredType = typeof(System.Int32); 

    if (list.Any(w => w is desiredType)) 
    { 
     //do something 
    } 
+1

Poner datos heterogéneos en una lista es buscar problemas, por cierto ... –

+1

Esa es una manera desagradable de usar genéricos, pero supongo que es solo para demostración. – Groo

Respuesta

4

w.GetType() == desiredType.

¿Por qué abusas de genéricos como ese?

+3

Tenga en cuenta que la igualdad de tipo no es lo mismo que 'is'; subclases, etc. serán confusas ... –

+0

Gracias. IRL nuestra aplicación tiene una docena de tipos de paneles en una colección y quería una forma genérica para determinar si un panel de un tipo particular ya está abierto. –

+0

En realidad, [la respuesta de AS-CII] (http://stackoverflow.com/questions/5803701/c-isis-type-in-list-question/5803762#5803762) debería estar más cerca del comportamiento 'is'. – Groo

1

si no recuerdo mal hay que escribir w is System.Int32 ..

+0

Ah ... pero el punto era usar el tipo varaible. –

+0

Ya veo. Entonces simplemente haz lo que AS-CII escribió :) .. –

1

El delegado está esperando un tipo o un espacio de nombres, pero que está suministrando una instancia de tipo. Prueba esto:

if (list.Any(w => w is Int32)) 
{ 
    //do something 
} 
+0

nq. El punto era usar la variable de tipo. gracias de todos modos –

+0

¿Cómo fue ese "el punto"? Su pregunta inicial indicó que "no le gusta la variable de tipo", y que debería haber una respuesta simple. Decir 'w is Int32' es mucho más simple que obtener una instancia de tipo y escribir' if (list.Any (w => w.GetType(). IsAssignableFrom (desiredType))) ' – matt

6

Prueba esto:

List<object> list = new List<object>(); 
list.Add("one"); 
list.Add(2); 
list.Add('3'); 

Type desiredType = typeof(System.Int32); 

if (list.Any(w => w.GetType().IsAssignableFrom(desiredType))) 
{ 
    //do something 
} 

De todos modos: ¿está seguro de que desea crear una lista de objetos ?

3

se puede utilizar el método de extensión LINQ OfType:

list.OfType <> devolverá un IEnumerable a ningún artículo del tipo especificado.

+0

Esto es lo que quiere 9 veces fuera de 10. El otro tiempo 1/10 en que el tipo no se conoce en el momento de la compilación (es decir, se pasa como un parámetro en lugar de un parámetro de tipo de un método genérico), en cuyo caso debe usar el método AS-CII. Pero generalmente OfType es lo que quieres. Además, OfType te ahorra el reparto cuando quieres recuperar los valores, lo cual es útil. – Mania