C # Enum, указывающий на другой Enum (рефакторинг) - PullRequest
0 голосов
/ 22 октября 2009

Могу ли я указать Enum на другой Enum? Вот потребности и детали:

В настоящее время:

  • У меня есть два открытых класса com.abcd.MyManager и com.abcd.data.MyObject.
  • В классе MyObject почти все закрыто, кроме члена перечисления типов.
  • Класс MyManager использует класс MyObject
  • Обратите внимание, что класс MyObject находится в отдельном пространстве имен.
  • Один из методов MyManager имеет следующую подпись:
    public void Init(string name, MyObject.Types type)<br> {<br> // does Init<br> }<br>

Требование рефакторинга:

  • Только из-за MyObject.Types, используемого в методе Init, а также он находится в другом пространстве имен. Разработчики должны включить оба пространства имен в свой код. Мне нравится перемещать перечисление MyObject.Types в класс MyManager. что-то похожее на это:
    public void Init(string name, MyManager.Types type)<br> {<br> // does Init<br> }<br>

Любые предложения о том, как я могу сделать это, не нарушая существующую структуру? Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 октября 2009

Вы можете иметь одно enum использование значений из другого, но вы не можете сделать их взаимозаменяемыми (без приведения).

public class MyManager
{
    public enum Types
    { 
        Type1 = com.abcd.data.MyObject.Types.Type1,
        Type2 = com.abcd.data.MyObject.Types.Type2,
        Type3 = com.abcd.data.MyObject.Types.Type3
    }
}

Это позволит вам разыграть в промежутке между двумя enum с и получить одинаковое значение для одинаковых имен членов, но вам все равно придется разыгрывать.

0 голосов
/ 22 октября 2009

У меня есть два предложения.

1) Переместите перечисление MyObject.Types в отдельный проект, на который ссылаются как MyObject, так и MyManager.

2) Создайте перечисление в проекте MyManager, совпадающее с перечислением в проекте MyObject. Тогда у вас может быть какой-то метод отображения:

public void Init(string name, MyManager.Types type)
{
   MyObject.Types t = type.ToMyObjectType();
}

internal static class Extensions
{
   public static MyObject.Types ToMyObjectType(this MyManager.Types t)
   {
      //do mapping
   }
}

Я бы не советовал использовать второй подход, потому что, если перечисление в MyObject когда-либо изменится, вам также нужно помнить об обновлении этого кода.

0 голосов
/ 22 октября 2009

Я не понимаю, почему перемещение перечисления может что-то сломать. Вы можете просто переместить enum в com.abcd.Types и убедиться, что файл кода MyObject содержит директиву using для пространства имен com.abcd. Если вы действительно хотите, чтобы enum был внутри MyManager, тогда MyObject должен ссылаться на MyManager.Types вместо просто Types.

Существуют ли какие-либо конкретные проблемы, с которыми вы сталкиваетесь при попытке рефакторинга?

...