2012-09-19 16 views
5

I tienen las siguientes clasesUso de una clase base genérica como un parámetro de un método

public class A<T> 
{ 
} 
public class B<T> : A<T> 
{ 
} 
public class C1 : B<string> 
{ 
} 
public class C2 : B<int> 
{ 
} 

Lo que me gusta a, es disponer de un método que puede tomar cualquier clase derivada de B<T>, como C1 o C2 como un parámetro. Pero declarar un método como

public void MyMethod(B<T> x) 

no funciona, se produce el error del compilador

error CS0246: El tipo o espacio de nombres `T' no se pudo encontrar. ¿Te estás perdiendo una directiva de uso o una referencia de ensamblaje? (CS0246)

Estoy bastante atrapado aquí. Crear una clase base no genérica para B<T> no funcionará, ya que no podría derivar de A<T> de esa manera. La única solución (fea) que pude pensar es definir una interfaz ficticia vacía que está "implementada" en B<T>. ¿Hay una manera más elegante?

Respuesta

9

Use un método genérico:

public void MyMethod<T> (B<T> x) 

Y se le puede llamar así:

MyMethod(new B<string>()); 
MyMethod(new C1()); 
MyMethod(new C2()); 
+0

impresionante. Sabía que funcionaría, si hago el método genérico, pero pensé que tenía que especificar el tipo al llamar explícitamente. Muchas gracias. – mat

4

Especificar T en el método:

public void MyMethod<T>(B<T> x) 

o tal vez en la clase que contiene el método:

public class Foo<T> 
{ 
    public void MyMethod(B<T> x){} 
} 

En ambos casos usted necesitará las mismas restricciones de tipo (si los hay) especificados en la clase original (es)

3

Cambiar la firma de su método como este:

public void MyMethod<T>(B<T> x) 
Cuestiones relacionadas