0
votes

Ajouter des éléments à n'importe quel objet d'ICOLLECTION à l'aide de la réflexion

J'essaie de supporter la cartographie de tout type de collection qui implémente Icollection via réflexion, car icollection nécessite une implémentation de l'ajout Méthode.

Ceci fonctionne bien pour la plupart des types de collecte courants, mais échoue à des cas de bord tels que LinkedList où la méthode Ajouter est masquée et ne peut être appelée qu'en casting de la liste linkedlist < T> à icollection .

Cependant, il n'est pas possible de convertir en icollection <> car il n'est pas covariant. < / p>

L'autre option que j'avais envisageait de rechercher des implémentations implicites et explicites d'ajouter, mais je ne vois aucune information sur la manière de le faire lorsque l'interface est générique?

Que serait la bonne approche à prendre?

mise à jour pour afficher le code de code où je réfléchis à partir de xml à la mappage d'objet. xxx

J'écris un Petit cadre sur la cartographie de l'objet à XML à l'aide d'attributs de classe et de propriété. Donc, je ne peux pas utiliser de génériques car tout cela est fait au moment de l'exécution.

Je vérifiais initialement iEnumerable avant, mais a couru dans d'autres bizarreries avec elle (Cordings Mettre en œuvre Iénumérable et sont immuables) que j'ai décidé qu'il était le plus sûr de coller à Icollection <>


8 commentaires

Vous dites que vous avez une solution de réflexion qui ne fonctionne pas dans certaines situations, ou vous en voulez un? Aussi pouvez-vous s'il vous plaît me montrer le code que vous avez


J'ai une solution de réflexion qui fonctionne pour la plupart des situations, à l'exception de ces cas de bord. J'ai mis à jour ma question à inclure le code démontrant le problème.


Pardon mon ignorance, mais la plupart des types de liste offrent un constructeur qui prend un ienumerable . Y a-t-il une raison pour laquelle vous préférez ne pas l'utiliser?


Aussi ce que @john a dit


@John, types comme la chaîne implémenter également iEnumerable et que je ne veux pas que ce soit accidentellement soit cartographié comme des listes quand ils ne le sont vraiment pas. Aussi iEnumerable est immuable et vous devez donc supposer que chaque type qui implémente iEnumérable aura une CTOR qui prend (iEnumerable )


Note latérale: soyez prudent avec des choses étranges telles que mycol : Icollection > si vous vous souciez.


NON IDINGAIRE Mettre en œuvre ICOLLECTION ? Non liée à cette question, mais je manipule également des types de cahicophones également.


Note latérale 2: Michael Randall Solutions avec une méthode générique aurait produit tellement de code simple / plus sûr avec stackoverflow.com/questions/232535/... (probablement dynamique cacherait même toute la réflexion ) ... Mais ils ont supprimé cette réponse parfaitement fine pour une raison quelconque.


3 Réponses :


2
votes

Avec implémentation d'interface explicite, l'objet a toutes les méthodes d'interface, mais le type de l'objet ne le fait pas.

Voici comment ajouter un élément à un LinkedList ou tout < Code> Icollection à réflexion: xxx


0 commentaires

0
votes

À peu près toutes les collections .NET prennent un iEnumerable comme constructeur, vous pouvez donc utiliser cela: xxx

Essayez-le en ligne

Évidemment, vous pouvez l'optimiser en déplaçant la population de la liste vers une autre méthode, puis peut-être utiliser votre méthode existante aussi loin que possible, puis utilisez ceci où vous ne pouvez pas.


0 commentaires

1
votes

Cette fonctionnalité est satisfaite au moment de la compilation à l'aide du CAST () méthode. Vous avez juste besoin d'une version d'exécution, qui est assez simple: xxx

Vous pouvez désormais prendre une collection non générique et la rendre générique au moment de l'exécution. Par exemple, ces deux sont équivalents: xxx

et vous pouvez convertir une collection entière avec ceci: xxx

cette solution Fonctionne avec des listes liées ainsi que tous les types d'autres types de collection.

Voir mon exemple de travail sur dotnetfiddle


0 commentaires