List<T> Foo<T>(Ilist list) where T : ?? is there any way to enforce T to be one of few classes ?eventually i want to do a switch on T..thanks.
5 Réponses :
Dans ce cas, il pourrait être une classe de base courante ou une interface que vous listeriez les objets partagés. Vous pouvez avoir list foo, bar et baz code> si elles implémentent chaque interface code> ifoo code>. À court d'utilisation de l'héritage, vous seriez coincé avec une liste d'objets. P>
Vous pouvez exiger que chaque classe que vous souhaitez autoriser dans votre liste implémente une interface Finalement, je veux faire un commutateur sur t .. p>
blockQuote>
au lieu d'un commutateur sur le type de l'objet, il peut être préférable d'avoir une méthode dans votre interface et de la mettre en œuvre différemment pour chaque classe. P> iSomething code>, puis crée une liste
Autant que je sache, cela n'est pas possible. Je recommanderais de dériver votre jeu de classes limité d'une classe de base commune ou d'une interface. P>
Appliquer une contrainte de type de cette manière indique que ces plusieurs classes sont liées à la fonctionnalité courante.
Vous devez implémenter une interface commune, puis limiter le type à cette interface: P>
public interface IUseful
{
public void UsefulMethod();
}
List<T> Foo<T>(IList list) where T : IUseful
{
// You now have access to all common functionality defined in IUseful
}
Je cherchais quelque chose de similaire. Je suis d'accord une interface commune est la meilleure solution. Bien que, actuellement, j'utilise deux bibliothèques et je ne peux pas modifier leur code pour utiliser l'interface commune. Alors y a-t-il un moyen de le faire sans interface?
Qu'est-ce que tu veux? Après le côlon, vous pouvez énumérer les types auxquels vous contraintes Pour plusieurs classes, peut-être implémenter une interface générique et définir votre contrainte pour cela pourrait faire le tour. P>
Veuillez regarder ce lien pour plus de détails: Contraintes sur les paramètres de type (C # Guide de programmation) P> t code> à. P>
Ces
peu de classes code> sont-ils liés ou partagent-ils une classe de base commune ou une interface qui les utilisent tous?Sachez simplement que vous pouvez parfois aller trop loin avec des génériques. Je travaille récemment sur quelque chose et j'ai eu une structure générique complexe où j'avais CLASSA
où p
, s. C'était tout ce qui est gentil et générique, mais a fini par être ingéniel et je ne pouvais pas l'utiliser efficacement. Au lieu de cela, j'ai dû diviser le code 3 manières et accepter un code similaire dans différentes classes. Voici une règle rapide - si vous pensez à faire
commutateur code> surt code> ou même le vérifier avec unsi code>, vous faites des génériques tort. Faites un pas en arrière et faites comprendre comment.@Kobi: à cela, j'ajouterais que lorsqu'une instance de paramètre est reçue sous forme de type T, l'instance est garantie du T ou un type dérivé de T; Il n'y a aucune garantie t sera le type exact. L'utilisation de génériques avec des contraintes peut éliminer la nécessité de tester le type d'une instance particulière, mais en l'absence de génériques, il faudrait tester le type de temps d'exécution d'un paramètre, tester le type d'exécution de T ne changera pas. la nécessité de tester le type du paramètre.