Donc, je suis sûr que cela a été répondu quelque part auparavant, mais je ne pouvais pas le trouver nulle part. En espérant que des génériques gourou peuvent aider.
ValidateUsing<Orangutan>(Foo);
5 Réponses :
Essayez ceci.
Merci Stan! J'avais évoqué votre réponse si j'avais suffisamment de réputation.
Effectuez les modifications suivantes:
Orangutan orangutan = new Orangutan(); action((T)(IAnimal)orangutan); IAnimal animal = new Orangutan(); action((T)animal);
Salut Yuriy, cela fonctionne très bien. Cela me fait partie du chemin (voir Edition). Merci!
Pourquoi instanciez-vous un Si vous réutilisez votre paramètre générique , vous n'aurez aucun problème de type ... p> Maintenant, en ce qui concerne la raison pour laquelle votre code ne fonctionne pas, tout ce que vous dites est que le type orangutan code> si vous êtes censé accepter tout
ianimal code>?
t code> découlera de
ianimal code>. Cependant, il pourrait tout aussi facilement être un
girafe code> en tant que
orangutan code>, de sorte que vous ne pouvez pas simplement affecter un
orangutan code> ou
ianimal < / code> à un paramètre de type
t code>. p> p>
Merci Bdukes, je viens d'utiliser l'orangutan comme exemple. Probablement un mauvais. Je veux pouvoir appeler l'action avec n'importe quel Ianimal. Dans le code "réel", l'Ianimal est stocké comme champ privé dans la classe. Donc, je ne suis pas vraiment instanciant quoi que ce soit.
public abstract class Animal { } public class Orangutan : Animal { } public void ValidateUsing<T>(Action<T> action) where T : Animal { Orangutan orangutan = new Orangutan(); action(orangutan as T); //This doesn't work either: Animal animal = new Orangutan(); action(animal as T); }
Salut Escalothèque, merci pour la réponse détaillée. J'ai tendance à utiliser des interfaces beaucoup plus souvent que des classes abstraites (en faveur de la composition contre héritage et tout cela), mais il est intéressant de savoir qu'il fonctionne avec une classe abstraite.
Ce qui est, c'est que T représente Alors, lorsque vous essayez de compiler Si vous souhaitez déclencher une action qui prend le paramètre d'un type qui implémente une interface hth. p> action (nouvel organatum ()) code> Vous obtenez une erreur car vous avez déclaré que l'action doit prendre un paramètre de type
t code> qui À son tour, cela pourrait être de type, disons,
poisson code> - vous ne pouvez pas lancer
organatutum code> à un
poisson code>, pouvez-vous? p >
ianimal code>, alors oubliez simplement les génériques et utilisez
action