Альтернативное решение
В моей компании мы избегаем «перепрыгивать через проекты», чтобы попасть в необычные проекты нижнего уровня. Например, наш уровень представления / API может ссылаться только на наш уровень домена, а уровень домена может ссылаться только на уровень данных.
Однако это проблема, когда есть перечисления, на которые должны ссылаться как уровни представления, так и уровни домена.
Вот решение, которое мы реализовали (пока). Это довольно хорошее решение и хорошо работает для нас. Другие ответы били все вокруг.
Основная предпосылка состоит в том, что перечисления не могут быть унаследованы - но классы могут. Так...
// 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
}
Затем "наследовать" перечисления в другом проекте более высокого уровня ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Это имеет три реальных преимущества ...
- Определения enum автоматически совпадают в обоих проектах - по определению.
- Любые изменения в определениях перечислений автоматически отображаются во втором, не внося никаких изменений во второй класс.
- Перечисления основаны на одном и том же коде - поэтому значения можно легко сравнить (с некоторыми оговорками).
Чтобы ссылаться на перечисления в первом проекте , вы можете использовать префикс класса: BaseEnums.StatusType.Pending или добавить «using static BaseEnums;» Заявление о вашем использовании.
Во втором проекте при работе с унаследованным классом, однако, я не мог заставить работать подход «используя статический ...» , поэтому все ссылки на «унаследованные перечисления» должны иметь префикс с классом, например, SubEnums.StatusType.Pending. , Если кто-нибудь придумает, как использовать «статический» подход во втором проекте, дайте мне знать.
Я уверен, что это можно изменить, чтобы сделать его еще лучше - но на самом деле это работает, и я использовал этот подход в рабочих проектах.
Пожалуйста, проголосуйте, если вы найдете это полезным.