énumération des génériques et des interfaces
-
10-07-2019 - |
Question
Si vous avez un ensemble de classes qui implémentent toutes une interface.
interface IMyinterface<T>
{
int foo(T Bar);
}
Je veux les mettre tous dans une liste et les énumérer.
List<IMyinterface> list
foreach(IMyinterface in list)
// etc...
mais le compilateur veut savoir ce que T est. Puis-je faire ceci? Comment puis-je surmonter ce problème?
La solution
Il n'y a pas de type IMyinterface, il n'y a qu'un type IMyinterface`1 qui nécessitera un argument de type. Vous pouvez créer un type IMyinterface: -
interface IMyinterface { ... }
puis en hériter
interface IMyinterface<T> : IMyinterface { ... }
Vous devez déplacer les membres que vous souhaitez utiliser dans la boucle foreach vers la définition IMyinterface.
Autres conseils
Si vous envisagez d’appeler une méthode avec T dans la signature, la réponse est que vous ne pouvez pas. Sinon, vous pouvez le faire comme le suggère anthonywjones
Vous devez toujours indiquer au compilateur ce que T est à un moment donné, mais vous pouvez faire exactement ce que vous avez demandé:
interface IMyinterface
{
int foo<T>(T Bar);
}
List<IMyinterface> list = new List<IMyinterface>();
foreach(IMyinterface a in list){}