2010-02-15 20 views
16

Actualmente tengo una solución con varios proyectos que en su mayoría usan las mismas clases. Como resultado, me pareció que sería una buena idea agregar una biblioteca de clase que contenga estas clases en la solución en lugar de repetir la clase en cada proyecto.C# Clases parciales

Sin embargo, un proyecto que tengo requiere algunas propiedades adicionales para algunas de las clases que son específicas de ese proyecto y no se usarán en ningún otro lado. Como resultado, pensé que debería usar clases parciales para agregar estas propiedades. Así que he hecho algo como esto:

En la biblioteca de clases:

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string Title { get; set; } 
     public string AuthorLast { get; set; } 
     public string AuthorFirst { get; set; } 
     public string Publisher { get; set; } 
     public string Edition { get; set; } 
     public string ISBN10 { get; set; } 
     public string ISBN13 { get; set; } 
    } 
} 

En el proyecto (MiProyecto):

namespace MyClassLibrary 
{ 
    public partial class Book 
    { 
     public string AdditionalProperty { get; set; } 
    } 
} 

he referenciado MyClassLibrary en MiProyecto (AC# ventanas forman aplicación), sin embargo, cuando trato de usar esta clase en el código detrás del formulario, recibo el siguiente error:

class MyClassLibrary.Book

Warning: The type 'MyClassLibrary.Book' in 'C:... (Project)' conflicts with the imported type 'MyClassLibrary.Book' in 'C:... (Class Library DLL)'. Using the type defined in 'C:...(project)'.

¿Alguna idea de lo que estoy haciendo mal o si todo mi enfoque es malo y debería estar haciendo otra cosa?

Respuesta

20

parciales no son para que abarca montajes. Si es necesario agregar a su clase para un tipo más específico de uso, se debe crear una clase derivada:

public class MyFoo 
{ 
    public string BasicProperty {get;set;} 
} 

public class MySpecificFoo : MyFoo 
{ 
    public string AnotherProperty {get;set;} 
} 

En su proyecto que requiera el tipo más específico de myFoo, utilizar MySpecificFoo lugar. Como hereda/deriva de MyFoo, tendrá todas las propiedades y funcionalidades de MyFoo, con las propiedades adicionales también. Esto es parte de Polymorphism, que es donde se encuentra la potencia real de OOP.

+0

¡gracias! Lo intentaré con una clase derivada ... ¡todavía nuevo en esto! – Andrew

+2

uh ... no, esto se llama "herencia"! –

+0

@Steven editado para mayor claridad –

9

En resumen, no puede usar las clases parciales en los proyectos. Toda la fuente debe compilarse al mismo tiempo, y eso se hace por proyecto.

Aquí hay una discusión completa sobre el SO en esto: Should you use a partial class across projects?

+0

Gracias por la respuesta rápida. ¿Tiene alguna idea de cómo puedo organizar mejor las clases luego de este problema? ¿Debería simplemente duplicarlos en los proyectos o simplemente agregar la propiedad a la clase en la biblioteca de la clase aunque sea solo para un proyecto? Editar: voy a probar las clases derivadas como se sugiere a continuación. gracias de nuevo – Andrew

+1

Me gustaría ir con la respuesta de Rex para encontrar una solución, heredar las clases parece ser el mejor enfoque ... a menos que haya una razón por la que no se puede, de ser así, ¿qué restricción adicional hay? –

+0

De [Skeet en esa pregunta vinculada] (http://stackoverflow.com/a/309944/1028230): 'No se puede escribir una clase parcial en los proyectos. Una clase parcial es una pieza de azúcar sintáctica de solo tiempo de compilación: todo el tipo termina en un solo ensamblaje, es decir, un proyecto. – ruffin

1

Por lo que estás tratando de hacer, en su lugar deberías tratar de usar las clases base y la herencia. O incluso mejor object composition.

+0

De la descripción inmediata, la composición definitivamente no es una mejor solución –

+0

@Steven Absolutamente. Solo encuentro que es útil señalar porque muchos novatos aprenden acerca de la herencia y luego se meten en problemas al usarlo ** en todas partes ** simplemente porque no saben nada mejor. –

0

Creo que esto está más en la línea de lo que está tratando de lograr.

Coloque todas sus clases comunes en un proyecto de biblioteca de clase y compílelo en una DLL.

A continuación, puede hacer referencia a esa DLL en proyectos externos. Cada vez que necesite agregarle una propiedad para el proyecto externo, puede heredar la clase y agregar allí la propiedad.

0

todo mal. Debería considerar métodos parciales en su lugar. Míralos. Son exactamente lo que pediste.

Cuestiones relacionadas