2012-09-19 14 views
5

Mam następujące klasyKorzystanie z ogólnej klasy bazowej jako parametr metody

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

Co chciałbym aby jest mieć metodę, która może przyjąć dowolną klasę pochodną od B<T>, jak C1 lub C2 jako parametr. Ale deklarując metodę jako

public void MyMethod(B<T> x) 

nie działa, to daje błąd kompilatora

Błąd CS0246: Typ lub obszaru nazw `T” nie może zostać odnaleziona. Brakuje dyrektywy użycia lub odwołania do zespołu? (CS0246)

Utknąłem tutaj. Utworzenie nietypowej klasy bazowej dla B<T> nie będzie działać, ponieważ nie będę w stanie uzyskać takiej wartości z A<T>. Jedynym (brzydkim) rozwiązaniem, które mogłem wymyślić jest zdefiniowanie pustego interfejsu-atrapa, który jest "implementowany" przez B<T>. Czy istnieje bardziej elegancki sposób?

Odpowiedz

9

Użyj metoda rodzajowa:

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

I można nazwać tak:

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

niesamowite. Wiedziałem, że to zadziała, gdybym uczynił tę metodę ogólną, ale pomyślałem, że muszę wyraźnie określić typ podczas wywoływania. Wielkie dzięki. – mat

4

Określ T na metodzie:

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

czy może na klasie zawierającej metoda:

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

W obu przypadkach trzeba te same ograniczenia typu (jeśli występują) podane w oryginalnej klasy (es)

3

zmienić podpis metodę tak:

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