Existe-t-il un moyen d'obtenir la déclaration de fonction suivante ?
public bool Foo<T>() where T : interface;
c'est-à-dire où T est un type d'interface (similaire à where T : class
et struct
).
Actuellement, je me suis contenté de :
public bool Foo<T>() where T : IBase;
Où IBase est définie comme une interface vide qui est héritée par toutes mes interfaces personnalisées... Pas idéal, mais cela devrait fonctionner... Pourquoi ne pouvez-vous pas définir qu'un type générique doit être une interface ?
Pour ce que ça vaut, je veux ça parce que Foo
fait de la réflexion où il a besoin d'un type d'interface... Je pourrais le passer en tant que paramètre normal et faire les vérifications nécessaires dans la fonction elle-même, mais ceci semblait beaucoup plus sûr (et je suppose un peu plus performant, puisque toutes les vérifications sont faites au moment de la compilation).
5 votes
En fait, votre IBase dea est le meilleur que j'ai vu jusqu'à présent. Malheureusement, vous ne pouvez pas l'utiliser pour les interfaces que vous ne possédez pas. Tout ce que C# devrait faire, c'est que toutes les interfaces héritent de IOjbect, tout comme toutes les classes héritent de Object.
3 votes
Note : Il se trouve que c'est une idée assez courante. Les interfaces vides comme
IBase
- utilisés de cette manière - sont appelés interfaces de marquage . Ils permettent des comportements spéciaux pour les types "marqués".0 votes
Autre note : Selon Directives pour la conception d'interfaces l'utilisation d'interfaces de marquage doit être évitée