Clases parciales en dlls separados

154

¿Es posible tener dos partes (mismo espacio de nombre, mismo nombre de clase) para una clase parcial en archivos DLL separados?

Puntilla
fuente
como los otros dijeron que no es posible, pero hay formas de complementar las clases con un nuevo comportamiento de diferentes fuentes, ¿qué es exactamente lo que quieres hacer en diferentes dlls?
Ozan
En mi caso, quiero agregar un par de métodos estáticos a una clase que se define en una biblioteca de terceros. Los métodos de extensión no funcionarán y tampoco lo harán las interfaces y la herencia, porque la clase es estática. Después de descubrir que puede tener clases estáticas parciales, vine aquí para averiguar si funciona en ensamblajes, pero parece que tampoco funcionará.
Ben

Respuestas:

232

De MSDN - Clases y métodos parciales :

Todas las definiciones de tipo parcial destinadas a ser partes del mismo tipo deben definirse en el mismo ensamblaje y el mismo módulo (archivo .exe o .dll). Las definiciones parciales no pueden abarcar múltiples módulos.

Justin Niessner
fuente
36

No. Las clases parciales son una característica puramente del lenguaje. Cuando se compila un ensamblaje, los archivos se combinan para crear el tipo. No es posible distribuir los archivos en diferentes ensamblajes.

Sin embargo, dependiendo de lo que desee hacer, es posible que pueda usar métodos de extensión para lograr lo que necesita.

Adam Robinson
fuente
13

No, no es posible. Cuando se compila el ensamblaje, la clase debe estar terminada.

Darin Dimitrov
fuente
8

Si bien otras respuestas proporcionan el desagradable "No" que nadie que desembarcó en esta página no quería ver ni oír, me llamó la atención otro pensamiento que aún no se ha mencionado aquí. Si se permitieran clases parciales en las asambleas, se obtendría acceso a miembros privados de tipos existentes que no fueron escritos por él, lo que le permite manipularlos de formas que no fueron intencionadas por el autor original, poniendo en peligro la funcionalidad de todas las clases heredadas. también.

No solo eso, esas clases en otras asambleas (y sus hijos) tendrían que volver a compilarse para que funcione. Por lo tanto, lógicamente no es posible permitir dividir una clase en diferentes ensamblajes.

punto net
fuente
Uno puede meterse fácilmente con miembros privados a través de la reflexión si realmente es necesario. No es posible dividir una clase entre ensamblados porque las referencias circulares no están permitidas y serían necesarias para que diferentes partes de la clase interactúen.
Zar Shardan
6

Puede usar métodos de extensión cuando desee agregar un método a una clase en un dll diferente. El único inconveniente de este método es que no puede agregar métodos estáticos.

miniaturas
fuente
3

La pregunta es ¿por qué querrías hacer una clase parcial en otro ensamblaje? Puede definir clases abstractas e interfaces a través de ensamblajes, tal vez necesite investigar eso.

Gleno
fuente
10
En mi humilde opinión, hay casos válidos, por ejemplo: es posible que desee agregar anotaciones de formulario MVC a una clase de modelo definida en un ensamblaje diferente. El conjunto en sí no sabe en qué contexto se utiliza, por lo que la clase en el conjunto no debe tener ninguna anotación. Sin embargo, podrían agregarse en una clase parcial en el contexto MVC (si fuera posible).
nyi
3
nyi, ¿por qué no simplemente heredar de esa clase y declarar tus atributos en la parte superior? Incluso puede llamarlo con el mismo nombre, si lo prefiere.
Gleno
0

Probablemente solo desee crear una clase Wrapper dentro de su propia biblioteca, alrededor de la clase en la biblioteca de la tercera parte. Luego agregue cualquier funcionalidad a la clase contenedora.

Joakim Kungsman
fuente