7
votes

Hériter de manière dynamique de la classe interne par réflexion

Y a-t-il un moyen de hériter d'une classe abstraite interne dans une classe d'exécution générée dynamiquement (telle que via réflexion) à l'aide de .NET Framework 4.0?


3 commentaires

Peut-être que certains contexte quant à ce que vous essayez d'atteindre et pourquoi vous aiderait à obtenir une réponse utile.


Je ne vois pas pourquoi cette question était fermée comme "pas une vraie question". Je pense que c'est clair ce que l'OP voulait demander. J'avoue que c'est vraiment plutôt "pervers" (comme @john Hanna écrit dans sa réponse), mais j'ai un problème (une classe qui était auparavant publique, a été rendue interne d'une version à une autre du cadre que nous dépendons), que nous pouvons "résoudre" en héritant d'une classe interne, si c'était possible ...


D'accord, il s'agit d'une question valable et pourrait survenir si une personne tente d'utiliser une bibliothèque tierce de la 3e parties de manière à ce que les créateurs d'origine n'avaient pas l'intention de. Pas idéal mais valable néanmoins. Je l'ai nommé pour la réouverture.


3 Réponses :


1
votes

vous ne pouvez pas. Vous pouvez utiliser des types qui ne sont pas publics à l'aide de Assembly.getType () , mais vous ne pouvez pas hériter d'eux. Jon Skeet explique dans cet article pourquoi c'est généralement une mauvaise idée de Accédez aux membres non publics et répond à votre question plus en profondeur que possible.


3 commentaires

Vous pouvez accéder à des types internes par réflexion.


@Yuriyfaktorovich Vous pouvez y accéder, mais autant que je sache, vous ne pouvez pas hériter d'eux.


Je suppose en fait que vous pouvez utiliser l'ILGenerator, mais je ne l'ai pas encore essayé.



5
votes

Bien sûr, vous pouvez et vous n'avez pas besoin de réflexion pour cela. La classe héritée doit juste être dans la même assemblée :)

Vous pouvez également configurer l'amitié entre les assemblages: http://msdn.microsoft.com/en-us/library/0tke9fxk%28V=VS.100%29.aspx , qui permettrait d'accéder aux classes internes d'un assemblage. Cette approche est parfois utile pour créer des ensembles d'unités d'unité nécessitant un accès interne aux assemblages testés


4 commentaires

+1 pour la valeur de divertissement. Mais on ne peut pas faire de l'amitié par réflexion, donc pas vraiment utile pour l'EOG.


J'interprète "ex." comme "par exemple", la réflexion pourrait donc ne pas être une exigence difficile.


Bon point ... Je suppose que @eog devrait obtenir -1 pour le titre ne correspondant pas à la question ... mais je pense que -2 est trop pour cette question.


Vous pouvez toutefois ajouter une méthode à l'assemblage qui a le type interne, dans cette méthode, vous pouvez créer une classe qui hérite et renvoie cette classe. Il semble plus facile de simplement ajouter l'attitude de visibilité des internes à l'Assemblée, vous pouvez le faire à peu près de la même manière que l'ajout d'une méthode et il est plus léger.



22
votes

Sortir d'un sentiment général de perversité face aux choses qui ne devraient pas être possibles, je lui ai donné une idée de voir jusqu'où je voudrais essayer de créer une classe qui héritée de System.CurrentSystemTezone < / code> (une classe interne dans MSCORLIB). Ça vous permet de créer un typebuilder mais lorsque vous appelez CreateType Il jette un Typeloadexception avec le message "L'accès est refusé: 'Système .CurrentSystemTzone '. "

Un peu plus de meudling telle que m'a amené à conclure que vous pouvez créer une assemblée de manière dynamique qui avait le nom fort qui l'a identifié comme un assemblage d'ami de l'assemblage dans lequel le type interne est défini. Mais alors, dans ce cas, vous ne pouviez que coder Classe FOO: CurrententsSystemTezone De toute façon, sans disciffre à gauche.

Quoi qu'il en soit, le code aussi loin que la ligne qui lance est inférieure, Juste au cas où n'importe qui est d'humeur à essayer une variante encore plus perverse sur l'idée, et veut un point de départ: xxx


0 commentaires