Solución alternativa
En mi empresa, evitamos "saltar sobre proyectos" para llegar a proyectos de nivel inferior no comunes. Por ejemplo, nuestra capa de presentación / API solo puede hacer referencia a nuestra capa de dominio, y la capa de dominio solo puede hacer referencia a la capa de datos.
Sin embargo, este es un problema cuando hay enumeraciones que deben ser referenciadas tanto por la presentación como por las capas de dominio.
Aquí está la solución que hemos implementado (hasta ahora). Es una solución bastante buena y funciona bien para nosotros. Las otras respuestas estaban llegando a todo esto.
La premisa básica es que las enumeraciones no se pueden heredar, pero las clases sí. Entonces...
// In the lower level project (or DLL)...
public abstract class BaseEnums
{
public enum ImportanceType
{
None = 0,
Success = 1,
Warning = 2,
Information = 3,
Exclamation = 4
}
[Flags]
public enum StatusType : Int32
{
None = 0,
Pending = 1,
Approved = 2,
Canceled = 4,
Accepted = (8 | Approved),
Rejected = 16,
Shipped = (32 | Accepted),
Reconciled = (64 | Shipped)
}
public enum Conveyance
{
None = 0,
Feet = 1,
Automobile = 2,
Bicycle = 3,
Motorcycle = 4,
TukTuk = 5,
Horse = 6,
Yak = 7,
Segue = 8
}
Luego, para "heredar" las enumeraciones en otro proyecto de nivel superior ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Esto tiene tres ventajas reales ...
- Las definiciones de enumeración son automáticamente las mismas en ambos proyectos, por definición.
- Cualquier cambio en las definiciones de enumeración se repite automáticamente en la segunda sin tener que realizar modificaciones en la segunda clase.
- Las enumeraciones se basan en el mismo código, por lo que los valores se pueden comparar fácilmente (con algunas advertencias).
Para hacer referencia a las enumeraciones en el primer proyecto , puede usar el prefijo de la clase: BaseEnums.StatusType.Pending o agregar un "uso de BaseEnums estáticos"; declaración a sus usos.
Sin embargo, en el segundo proyecto al tratar con la clase heredada, no pude obtener el "uso de static ..." enfoque funcionara, por lo que todas las referencias a las "enumeraciones heredadas" irían precedidas de la clase, por ejemplo, SubEnums.StatusType.Pending . Si a alguien se le ocurre una forma de permitir que se use el enfoque de "usar estática" en el segundo proyecto, avíseme.
Estoy seguro de que esto se puede ajustar para hacerlo aún mejor, pero esto realmente funciona y he usado este enfoque en proyectos de trabajo.
Por favor vote esto si lo encuentra útil.