2010-01-12 14 views
22

Me estoy volviendo loco de cerebro en esto; Tengo varias listas definidas, basadas en clases específicas (c1, c2, c3 ...). Tengo un método que procesará la información en estas listas. Lo que quiero hacer es pasar en la lista específica, pero hacer que el método acepte la lista genérica y luego, a través de typeof, determinar qué trabajo específico realizar. Sé que es posible, pero no puedo entender la sintaxis en el lado del método. entonces, por ejemplo:Pasando una Lista genérica <> en C#

List<c1> c1var; 
List<c2> c2var; 
List<c3> c3var; 

some_method(c1var); 
some_method(c2var); 
some_method(c3var); 

class some_thing 
some_method(List<> somevar) 
if typeof(somevar).name = x then 
esle if typeof(somevar).name = y then.... 

¿Cómo configuro la lista de parámetros para el método?

gracias de antemano R. Sanders

+2

Pregunta rápida, ¿por qué no sobrecargaría algún_ método para aceptar tipos específicos de listas en lugar de hacer typeof? –

Respuesta

40

tiene que declarar some_method a ser genérica, también.

void SomeMethod<T>(List<T> someList) 
{ 
    if (typeof(T) == typeof(c1)) 
    { 
     // etc 
    } 
} 
+0

gracias ... justo lo que necesitaba – RockySanders99

+12

Cuidado al usar typeof así. Eso verificará que los tipos sean exactamente iguales sin respetar la jerarquía de tipos. Como resultado, algo como MemoryStream y Stream no se evaluará con el mismo tipo (typeof (MemoryStream) == typeof (Stream) se evalúa como falso). Esto puede ser deseado, pero es algo a tener en cuenta. Usar la palabra clave 'is' es la forma típica de evaluar tipos porque "MemoryStream is Stream" se evaluará como verdadero, ya que comparten la misma jerarquía de objetos. –

0

en la lista de puesta sección de parámetros a continuación, intente en el código switch(typeof(T){case typeof(int): break;})

7

cuidadoso con el uso de typeof (TYP1) == typeof (tyP2). Eso probará para ver si los tipos son equivalentes sin tener en cuenta la jerarquía de tipos.

Por ejemplo:

typeof(MemoryStream) == typeof(Stream); // evaluates to false 
new MemoryStream() is Stream; //evalutes to true 

Una mejor manera de comprobar para ver si un objeto es de un tipo es utilizar el 'es' palabra clave. Un ejemplo es a continuación:

public static void RunSnippet() 
{ 
    List<c1> m1 = new List<c1>(); 
    List<c2> m2 = new List<c2>(); 
    List<c3> m3 = new List<c3>(); 

    MyMeth(m1); 
    MyMeth(m2); 
    MyMeth(m3); 
} 

public static void MyMeth<T>(List<T> a) 
{ 
    if (a is List<c1>) 
    { 
     WL("c1"); 
    } 
    else if (a is List<c2>) 
    { 
     WL("c2"); 
    } 
    else if (a is List<c3>) 
    { 
     WL("c3"); 
    } 
} 
Cuestiones relacionadas