Comment pouvez-vous hériter d'une classe scellée en utilisant la réflexion dans .Net?
Avant de commencer la cuisson à moi, je ne cherche PAS à faire cela, mais quelqu'un dans un autre post a dit que c'était possible. Comment est-il possible? Je n'ai jamais entendu parler de l'héritage de tout ce que l'aide de la réflexion. Mais j'ai vu des choses étranges...
source d'informationauteur Kilhoffer | 2008-09-30
Vous devez vous connecter pour publier un commentaire.
Sans fonctions virtuelles à remplacer, il n'y a pas beaucoup de point dans le sous-classement d'une classe scellée.
Si vous essayez d'écrire une classe scellée avec une fonction virtuelle, vous obtenez l'erreur suivante compilateur:
Cependant, vous pouvez obtenir des fonctions virtuelles en classe scellée en les déclarant dans une classe de base (de ce genre),
Le problème demeure cependant, je ne vois pas comment on pourrait se faufiler le compilateur pour vous permettre de déclarer une sous-classe. J'ai essayé d'utiliser IronRuby (le rubis est la hackiest de tous les hackety langues), mais même elle ne serait pas me laisser.
Les scellés ' partie est incorporée dans le MSIL, donc je suppose que la CLR lui-même en fait tout son sens. Vous devez charger le code, dissassemble, retirez les scellés ' peu, puis de le remonter, et de charger la nouvelle version.
Je suis désolé pour l'affichage des hypothèses incorrectes dans l'autre thread, je n'ai pas à rappeler correctement. À l'aide de l'exemple suivant, l'utilisation de la Réflexion.L'émission montre comment dériver d'une autre classe, mais il ne parvient pas à l'exécution de jeter un TypeLoadException.
Il POURRAIT (augmentation de la taille si je pouvais). Selon le gars sur freenode, il aurait fallu modifier le code octet, à l'aide de la Réflexion.Émettre, et en remettant à l'équipe une nouvelle série de byte code.
Pas que je SAVOIR comment ... c'est exactement ce qu'ils pensaient.
Les autres affiches de mai ont été de penser que plus le long des lignes de Réflexion.Émettent plutôt que les habituels en lecture seule Réflexion Api.
Cependant, n'est toujours pas possible (au moins selon cet article). Mais il est certainement possible de visser des choses en place avec la Réflexion.Émettent qui ne sont pas pris au piège jusqu'à ce que vous essayez de réellement exécuter le code émis.
Créer une nouvelle classe appelée GenericKeyValueBase
mettre ça
Et héritent de cette de plus, vous pouvez ajouter d'autres méthodes d'extension pour Ajouter/Supprimer (AddAt et RemoveAt) pour votre nouvelle classe dérivée (et d'en faire une collection/dictionnaire) si vous vous sentez vraiment cool.
Une simple implémentation exemple lorsque vous utilisez un Système normal.Les Collections.Génériques.KeyValuePair de base, mais plutôt de l'utiliser le code ci-dessus