Soluzione alternativa
Nella mia azienda, evitiamo di "saltare i progetti" per arrivare a progetti di livello inferiore non comuni. Ad esempio, il nostro livello di presentazione / API può solo fare riferimento al nostro livello di dominio e il livello di dominio può solo fare riferimento al livello di dati.
Tuttavia, questo è un problema quando ci sono enumerati che devono essere referenziati sia dalla presentazione che dai livelli del dominio.
Ecco la soluzione che abbiamo implementato (finora). È una soluzione abbastanza buona e funziona bene per noi. Le altre risposte stavano colpendo tutto intorno a questo.
La premessa di base è che gli enum non possono essere ereditati, ma le classi possono. Così...
// 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
}
Quindi, per "ereditare" gli enum in un altro progetto di livello superiore ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Questo ha tre vantaggi reali ...
- Le definizioni enum sono automaticamente le stesse in entrambi i progetti, per definizione.
- Eventuali modifiche alle definizioni di enum vengono automaticamente ripetute nella seconda senza dover apportare modifiche alla seconda classe.
- Gli enum si basano sullo stesso codice, quindi i valori possono essere facilmente confrontati (con alcuni avvertimenti).
Per fare riferimento agli enumerazioni nel primo progetto , è possibile utilizzare il prefisso della classe: BaseEnums.StatusType.Pending o aggiungere un "utilizzo di BaseEnums statici;" dichiarazione ai tuoi usi.
Nel secondo progetto , tuttavia, quando ho a che fare con la classe ereditata, non sono riuscito a far funzionare l' approccio "using static ..." , quindi tutti i riferimenti agli "enumerativi ereditati" sarebbero preceduti dalla classe, ad esempio SubEnums.StatusType.Pending . Se qualcuno trova un modo per consentire l' approccio "using static" da utilizzare nel secondo progetto, fammelo sapere.
Sono sicuro che questo può essere modificato per renderlo ancora migliore, ma in realtà funziona e ho usato questo approccio in progetti di lavoro.
Per favore vota questo se lo ritieni utile.