2009-07-24 14 views
0

Lasst uns sagen, dass ich dieses:auf generische abstrakte Klasse Casting zeigt T als ungelöst Symbol

public abstract class myClass<T> : Ob<T> where T : Ob<T>, new() 

Jetzt in einem Verfahren innerhalb abstrakten myClass definiert, erstelle ich ein Objekt der Klasse myType und auf ein Verfahren innerhalb myType definiert , Übergebe ich die abstrakte Klasse myClass, die sie aufruft.

Also in meiner myType Klasse, ich habe:

public void myMethod(object caller) 

Meine Frage ist, wie kann ich Objekt Anrufer auf die Art der abstrakten Klasse geworfen, die sie aufgerufen?

Ich versuchte

(myClass<T>) 

und

(myClass) 

aber beide gescheitert.

Generika machen meinen Kopf verletzt.

+0

Nebenbei bemerkt, gibt es einen Grund, warum Sie eine "rekursive" Ob haben, wo T: Ob ? Ich bin daran interessiert, einen guten Grund dafür zu kennen. – Mank

+0

erbte ich diesen Code und versuchte, dass mich :-) – Matt

Antwort

3

Sie können dies tun, mit wie wie folgt:

public void MyMethod(object caller) 
{ 
    myClass<T> test = caller as myClass<T>; 
    if (test != null) 
    { 
     // Use test here 
    } 
} 

aber sagen, dass, wenn man immer in einem bekannten myClass<T> vorbei es wahrscheinlich sauberer sein würde nur verwenden:

public void MyMethod(myClass<T> caller) 
{ 
    // Use caller directly... 
} 

Edit: hier ist ein kleines Beispiel zu demonstrieren:

using System; 

public class myClass<T> where T : new() 
{ 
    public T Value; 

    public void CopyFromSecond(object caller) 
    { 
     myClass<T> test = caller as myClass<T>; 
     this.Value = test.Value; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     myClass<int> test = new myClass<int> { Value = 3 }; 
     myClass<int> test2 = new myClass<int> { Value = 5 }; 

     Console.WriteLine(test.Value); 
     test.CopyFromSecond(test2); 
     Console.WriteLine(test.Value); 
     Console.ReadKey(); 
    } 
} 

Dies druckt 3 dann 5, wie erwartet.


Edit 2:

Wenn Sie die Art von T von einem anderen myClass<T> zu finden sind versuchen, müssen Sie Reflektion verwenden. Die Methode, die Sie benötigen, ist Type.GetGenericTypeDefinition.

+0

Wenn Sie das 'wie' verwenden, bekomme ich immer noch einen Fehler, der besagt, dass das T von myClass nicht definiert ist. – Matt

+0

Sein Problem ist, dass er es von _another_ Klasse macht, Methode von der einige 'myClass ' genannt wird. Und er möchte das "T" herausfinden. –

+0

@Pavel: Ich bin nicht 100% sicher, was er will - aber ich fügte Beispielcode hinzu, verbunden mit der Type-Methode, die erforderlich ist, um den Typ von T zu erhalten. Wenn Sie in seinen Wünschen richtig sind, ist Reflektion der einzige Weg zu gehen . –

0

Warum brauchen Sie überhaupt die Besetzung? Vielleicht möchten Sie:

public void myMethod<T>(myClass<T> caller) 

Andernfalls wird die Antwort auf Ihre Frage ist - Sie können nicht, weil Sie nicht wissen, welche besonderen Spezialisierung von myClass Sie genannt.

+0

Guter Punkt, um herauszufinden, aber in public void MyMethod (myClass Anrufer) die T ist noch nicht gültig. – Matt

+0

Äh, warum? Die Deklaration führt einen neuen generischen Typparameter ein. Bist du sicher, dass du '' nach 'myMethod' nicht verpasst hast? Wenn Sie nicht, und es immer noch nicht kompilieren, was ist die Fehlermeldung? –

Verwandte Themen