2012-09-19 15 views
5

ho le seguenti classiUtilizzando una classe base generica come parametro di un metodo

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

Nei vorrei a, è un metodo che può assumere qualsiasi classe derivata da B<T>, come C1 o C2 come parametro Ma dichiarando un metodo come

public void MyMethod(B<T> x) 

non funziona, produce l'errore del compilatore

CS0246 Errore: Il nome del tipo o dello spazio dei nomi `T' non è stato trovato. Ti manca una direttiva using o un riferimento assembly? (CS0246)

Sono abbastanza bloccato qui. La creazione di una baseclass non generica per B<T> non funzionerà, dal momento che non sarei in grado di derivare da A<T> in questo modo. L'unica (brutta) soluzione che potrei pensare è definire un'interfaccia fittizia vuota che sia "implementata" da B<T>. C'è un modo più elegante?

risposta

9

Utilizzare un metodo generico:

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

E si può chiamare in questo modo:

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

impressionante. Sapevo che avrebbe funzionato, se avessi reso il metodo generico, ma ho pensato che dovevo specificare il tipo dopo aver chiamato esplicitamente. Grazie mille. – mat

4

Specificare T sul metodo:

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

o forse sulla classe contenente il metodo:

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

In entrambi i casi avrete bisogno gli stessi vincoli di tipo (se presenti) specificati sulla classe originale (es)

3

modificare la firma del metodo come questo:

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