2012-09-19 13 views
5

Ich habe die folgenden KlassenMit Hilfe einer generischen Basisklasse als Parameter einer Methode

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

Was möchte ich an, ein Verfahren ist haben, die jede Klasse von B<T>, wie C1 oder C2 abgeleitet nehmen als ein Parameter. Aber erklärt ein Verfahren, wie

public void MyMethod(B<T> x) 

nicht funktioniert, liefert es den Compilerfehler

CS0246 Fehler: Der Typ oder Namespace-Name `T‘ konnte nicht gefunden werden. Vermissen Sie eine using-Direktive oder eine Assembly-Referenz? (CS0246)

Ich bin hier ziemlich fest. Das Erstellen einer nicht-generischen Basisklasse für B<T> funktioniert nicht, da ich nicht auf diese Weise von A<T> ableiten könnte. Die einzige (hässliche) Lösung, die ich mir vorstellen kann, ist eine leere Dummy-Schnittstelle zu definieren, die von B<T> "implementiert" wird. Gibt es einen eleganteren Weg?

Antwort

9

eine generische Methode verwenden:

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

Und Sie können es wie so nennen:

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

ehrfürchtig. Ich wusste, dass es funktionieren würde, wenn ich die Methode generisch machen würde, aber ich dachte, dass ich den Typ beim Aufruf explizit angeben müsste. Vielen Dank. – mat

4

T auf der Methode angeben:

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

oder vielleicht auf die Klasse enthält, die Methode:

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

In beiden Fällen werden Sie die gleiche Art Einschränkungen müssen (falls vorhanden) auf der Originalklasse angegeben (n)

3

Ändern Sie die Signatur Ihrer Methode wie folgt aus:

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