2009-07-24 5 views
0

Disons que j'ai ceci:casting à la classe abstraite générique montre T comme symbole non résolu

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

maintenant dans une méthode définie à l'intérieur myClass abstraite, je crée un objet de classe MyType et sur une méthode définie à l'intérieur myType , Je passe la classe abstraite myClass en l'appelant.

Donc, dans ma classe myType, j'ai:

public void myMethod(object caller) 

Ma question est, comment puis-je jetai l'appelant d'objet au type de la classe abstraite qui l'a appelé?

J'ai essayé

(myClass<T>) 

et

(myClass) 

mais les deux échoué.

Les génériques me font mal à la tête. Pourquoi avez-vous besoin de la fonte en premier lieu?

+0

Sur une note de côté, y at-il une raison pour laquelle vous avez un "récursif" Ob où T: Ob ? Je suis intéressé de connaître une bonne raison derrière cela. Je – Mank

+0

hérité ce code et essayait de comprendre que moi-même :-) – Matt

Répondre

3

Vous pouvez le faire avec comme, comme suit:

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

Cela étant dit, si vous passez toujours dans un connu myClass<T> il serait probablement plus propre à utiliser simplement:

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

Edit: Pour démontrer, voici un petit échantillon:

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(); 
    } 
} 

Cela imprime 3 puis 5, comme prévu.


Edit 2:

Si vous essayez de trouver le type de T d'un autre myClass<T>, vous devrez utiliser la réflexion. La méthode dont vous avez besoin est Type.GetGenericTypeDefinition.

+0

Si j'utilise le 'as', j'obtiens toujours une erreur en déclarant le T de myClass est indéfini – Matt

+0

Son problème est qu'il le fait depuis _another_ class, dont la méthode est appelée par myClass '. Et il veut savoir que «T». –

+0

@Pavel: Je ne suis pas sûr à 100% de ce qu'il veut - mais j'ai ajouté un exemple de code, plus lié à la méthode de type nécessaire pour obtenir le type de T. Si vous avez raison, la réflexion est la seule solution. . –

0

Pourquoi? Peut-être que vous voulez:

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

Sinon, la réponse à votre question est - vous ne pouvez pas, parce que vous ne savez pas quelle spécialisation particulière de myClass vous a appelé.

+0

Bon point, mais dans public void maméthode (myClass appelant) T est toujours pas valide. – Matt

+0

Euh, pourquoi? La déclaration introduit un nouveau paramètre de type générique. Êtes-vous sûr de n'avoir pas manqué '' après 'myMethod'? Si vous n'avez pas, et il ne compile toujours pas, alors quel est le message d'erreur? –

Questions connexes