9
votes

Méthode générique avec action paramètre

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


0 commentaires

5 Réponses :


2
votes

Essayez ceci. XXX


1 commentaires

Merci Stan! J'avais évoqué votre réponse si j'avais suffisamment de réputation.



2
votes

Effectuez les modifications suivantes:

Orangutan orangutan = new Orangutan();
action((T)(IAnimal)orangutan); 


IAnimal animal = new Orangutan();
action((T)animal); 


1 commentaires

Salut Yuriy, cela fonctionne très bien. Cela me fait partie du chemin (voir Edition). Merci!



7
votes

Pourquoi instanciez-vous un orangutan si vous êtes censé accepter tout ianimal ? xxx

Si vous réutilisez votre paramètre générique , vous n'aurez aucun problème de type ...

Maintenant, en ce qui concerne la raison pour laquelle votre code ne fonctionne pas, tout ce que vous dites est que le type t découlera de ianimal . Cependant, il pourrait tout aussi facilement être un girafe en tant que orangutan , de sorte que vous ne pouvez pas simplement affecter un orangutan ou ianimal < / code> à un paramètre de type t .


1 commentaires

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.



0
votes
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); 
}

1 commentaires

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.



4
votes

Ce qui est, c'est que T représente de type , qui implémente Ianimal.

Alors, lorsque vous essayez de compiler action (nouvel organatum ()) Vous obtenez une erreur car vous avez déclaré que l'action doit prendre un paramètre de type t qui À son tour, cela pourrait être de type, disons, poisson - vous ne pouvez pas lancer organatutum à un poisson , pouvez-vous?

Si vous souhaitez déclencher une action qui prend le paramètre d'un type qui implémente une interface ianimal , alors oubliez simplement les génériques et utilisez action

hth.


0 commentaires