Question

Question :
Y at-il un moyen statique pour déterminer de manière fiable le type contenu par un type dérivé de CollectionBase, en utilisant la réflexion ou Microsoft.Cci?

Historique :
Je travaille sur un générateur de code que les types de copies, fait des versions personnalisées de ces types, et les convertisseurs entre. Il arpente les types dans l'ensemble de source via Microsoft.Cci. Il imprime le code source en utilisant des modèles textuels. Il fait beaucoup de conversion et de personnalisation, et sur le code que lancers je ne se soucient pas.

Dans mon code résultant, je l'intention de remplacer List<T> partout qu'un CollectionBase, IEnumerable<T> ou T[] a déjà été utilisé. Je veux utiliser List<T> parce que je suis assez sûr que je peux sérialisation sans travail supplémentaire, ce qui est important pour mon application. T est concrète dans tous les cas. J'essaie de ne pas copier les classes de CollectionBase parce que je dois copier sur la mise en œuvre personnalisée, et je voudrais éviter d'avoir à faire dans mon générateur de code.

La seule partie que je vais avoir un problème avec la détermination est T pour List<T> lors du remplacement d'un CollectionBase personnalisé.

Qu'est-ce que je l'ai fait jusqu'à présent :
J'ai brièvement examiné les documents et les échantillons MSDN pour CollectionBase, et ils mentionnent la création d'une méthode Add personnalisé sur votre type dérivé. Je ne pense pas que ce soit de quelque façon forcée, donc je ne suis pas sûr que je peux compter sur cela. Un implémenteur pourrait-il nommer autre chose, ou pire, une collection qui prend en charge plusieurs types, avec Object comme seul ancêtre commun.

Alternatives J'ai examiné :
Peut-être la sérialisation par défaut fait quelques trucs que je peux tirer profit. Y at-il une sérialisation par défaut pour les collections de CollectionBase, ou avez-vous généralement à mettre en œuvre vous-même? Si vous devez le faire vous-même, est-il des métadonnées fiables que je pourrais regarder afin de déterminer les types? Si elle prend en charge la sérialisation par défaut, il ne compter sur les types d'exécution des éléments de la collection?

Je pourrais faire une cartographie dans mon générateur de code de types de CollectionBase connus, mis en correspondance avec leur T correspondant pour List<T>. Si un type de CollectionBase étant donné que je rencontre n'est pas dans la liste, lancer une exception. C'est probablement ce que je vais aller avec si je n'y a pas une alternative fiable.

Était-ce utile?

La solution

Je ne suis pas encore assez sûr de ce que vous voulez faire pour donner des conseils. Pourtant, les classes dérivées ne vos CollectionBase en œuvre tous les Ajouter (T)? Si oui, vous pouvez chercher une méthode Add avec un seul paramètre de type autre que l'objet, et utiliser ce type T.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top