C # Копирование перечисления из одного объекта в другой - PullRequest
5 голосов
/ 11 августа 2011

У меня есть два очень похожих, но не идентичных объекта C #. Я копирую значения из одного класса в другой.

Каждый класс имеет некоторые свойства, которые предоставляют тип перечисления. Внутри перечисления одинаковы, но имена разные, например

public enum EnumA
{
 A,
 B
} 

public EnumA EnumAProperty
{
 get{ return enumA;}
}

public enum EnumB
{
 A,
 B
} 

public EnumB EnumBProperty
{
 get{ return enumB;}
}

Я хочу присвоить значение, возвращаемое EnumBProperty для EnumAProperty, возможно ли это?

Ответы [ 6 ]

4 голосов
/ 11 августа 2011

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

EnumAProperty = (EnumA) EnumBProperty;

Дажехуже с приведением типов, если у вас есть элементы в исходном перечислении без эквивалента в месте назначения - ниже больше цветов, чем фигур:

enum Color { Red = 0, Yellow = 1, Blue = 2 };
enum Shape ( Square = 0, Triangle = 1 };

Color color = Color.Red;
Shape shape = (Shape) color;

shape может закончиться со значением 2 дажехотя это значение не определено.

Вместо этого я бы предложил использовать для сопоставления оператор switch:

EnumAProperty = ConvertToA(EnumBProperty);

...

private static EnumA ConvertToA(EnumBProperty b)
{
    switch (b)
    {
        case EnumB.Flannel: return EnumA.HandTowel;
        case EnemB.Vest: return EnumA.UnderShirt;
        ...
        default: throw new ArgumentOutOfRangeException("b");
    }
}
4 голосов
/ 11 августа 2011

Каждый enum член имеет соответствующее целочисленное значение.
По умолчанию эти значения присваиваются в порядке возрастания, начиная с 0.

Если порядок элементов в перечислениях (и, следовательно, их числовые значения) одинаков, вы можете просто привести числовое значение к EnumB, чтобы получить элемент EnumB с тем же значением:

 EnumBProperty = (EnumB)(int)EnumAProperty;

Если нет, вам нужно пересмотреть его:

EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString());
1 голос
/ 11 августа 2011

Пока оба перечисления разных типов не могут быть назначены напрямую.Вы можете определить целочисленное смещение для элементов, чтобы вы могли назначать значения через целое значение

public enum EnumA 
{  
 A = 0,  
 B = 1
}   

public enum EnumB
{  
 A = 0,  
 B = 1
}   

EnumBPropertry = (int)EnumAProperty
0 голосов
/ 11 августа 2011
EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString());
0 голосов
/ 11 августа 2011

Попробуйте следующее:

EnumAProperty = (EnumA)Enum.Parse(typeof(EnumA), EnumBProperty.ToString);
0 голосов
/ 11 августа 2011

Вы можете преобразовать его в целое число или преобразовать в строку, а затем выполнить Enum.Parse для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...