Classes partielles dans des DLL distinctes


154

Est-il possible d'avoir deux parties (même espace de noms, même nom de classe) dans une classe partielle dans des DLL distinctes?


comme les autres l'ont dit, ce n'est pas possible, mais il existe des moyens de compléter les classes avec un nouveau comportement provenant de différentes sources, que voulez-vous faire exactement dans différentes dll?
Ozan

Dans mon cas, je souhaite ajouter quelques méthodes statiques à une classe définie dans une bibliothèque tierce. Les méthodes d'extension ne fonctionneront pas et les interfaces et l'héritage non plus, car la classe est statique. Après avoir découvert que vous pouvez avoir des classes statiques partielles, je suis venu ici pour savoir si cela fonctionne dans les assemblages, mais hélas, il semble que cela ne fonctionnera pas non plus.
Ben

Réponses:


232

À partir de MSDN - Classes partielles et méthodes :

Toutes les définitions de type partiel destinées à être des parties du même type doivent être définies dans le même assemblage et le même module (fichier .exe ou .dll). Les définitions partielles ne peuvent pas couvrir plusieurs modules.


36

Non. Les classes partielles sont une fonctionnalité purement linguistique. Lorsqu'un assembly est compilé, les fichiers sont combinés pour créer le type. Il n'est pas possible de répartir les fichiers dans différents assemblages.

En fonction de ce que vous voulez faire, cependant, vous pourrez peut-être utiliser des méthodes d'extension pour accomplir ce dont vous avez besoin.


13

Non ce n'est pas possible. Lorsque l'assembly est compilé, la classe doit être terminée.


8

Alors que d'autres réponses fournissent le "Non" désagréable que quiconque atterrissant sur cette page ne voulait ni voir ni entendre, j'ai été frappé par une autre pensée qui n'a pas encore été mentionnée ici. Si des classes partielles étaient autorisées dans les assemblys, on aurait accès aux membres privés des types existants qui n'ont pas été écrits par lui, lui permettant ainsi de les manipuler d'une manière qui n'était pas prévue par l'auteur d'origine, mettant ainsi en péril la fonctionnalité de toutes les classes héritées. aussi.

Non seulement cela, ces classes dans d'autres assemblys (et leurs enfants) devraient être recompilées pour que cela fonctionne. Ainsi, il n'est logiquement pas possible d'autoriser la division d'une classe sur différents assemblys.


On peut facilement jouer avec des membres privés via la réflexion si vraiment nécessaire. Il n'est pas possible de diviser une classe entre des assemblages car les références circulaires ne sont pas autorisées et elles seraient nécessaires pour que différentes parties de la classe interagissent.
Zar Shardan

6

Vous pouvez utiliser des méthodes d'extension lorsque vous souhaitez ajouter une méthode à une classe dans une autre DLL. Le seul inconvénient de cette méthode est que vous ne pouvez pas ajouter de méthodes statiques.


3

La question est pourquoi voudriez-vous créer une classe partielle dans un autre assembly? Vous pouvez définir des classes abstraites et des interfaces entre les assemblys, vous devez peut-être vous pencher là-dessus.


10
À mon humble avis, il existe des cas valides, par exemple: vous pouvez ajouter des annotations de formulaire MVC à une classe de modèle définie dans un assemblage différent. L'assembly lui-même ne sait pas dans quel contexte il est utilisé, donc la classe de l'assembly ne doit pas avoir d'annotations. Ils pourraient être ajoutés dans une classe partielle dans le contexte MVC (si c'était possible).
nyi

3
nyi, pourquoi ne pas simplement hériter de cette classe et déclarer vos attributs en haut? Vous pouvez même l'appeler du même nom, si vous préférez.
Gleno

0

Vous souhaitez probablement simplement créer une classe Wrapper dans votre propre bibliothèque, autour de la classe dans la bibliothèque de 3e partie. Ajoutez ensuite n'importe quelle fonctionnalité à la classe wrapper.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.