2011-08-11 35 views
5

İki benzer ama aynı C# nesnesine sahibim. Değerleri bir sınıftan diğerine kopyalıyorum.C# Bir nesneden diğerine numaralandırma Kopyalama

Her sınıf, bir numaralandırma türünü ortaya çıkaran bazı özelliklere sahiptir. Numaraların iç kısmı aynıdır, ancak isimler farklıdır.

public enum EnumA 
{ 
A, 
B 
} 

public EnumA EnumAProperty 
{ 
get{ return enumA;} 
} 

public enum EnumB 
{ 
A, 
B 
} 

public EnumB EnumBProperty 
{ 
get{ return enumB;} 
} 

Ben EnumAProperty için EnumBProperty döndü değeri atamak istediğiniz bu mümkün mü?

+0

Ve evet ben bir set lazım biliyorum aracılığıyla değer atayabilirsiniz böylece bir öğe için ofset tamsayı tanımlayabilirsiniz! – AJM

+0

hmmm, enum türlerinin bu şekilde uyumlu olup olmadığından emin değilsiniz ... en123'e değerleri atamadıkça ve EnumA değerini almamış ve bu değeri EnumB olarak atamamışsanız –

+0

. Işe yarar mı? –

cevap

4

sen döküm yoluyla yapabilirsiniz ama kırılgan olduğu gibi bunu tavsiye etmem - enum üyelerinden herhangi yeniden sıralanır veya yeni öğeler sonuç ekledi eğer yapamaz: değilse, yeniden ayrıştırmak gerekiyor beklediğiniz gibi olun. Eğer hedef hiçbir eşdeğer kaynak enum öğeleri varsa

EnumAProperty = (EnumA) EnumBProperty; 

döküm ile Daha da kötüsü

olduğunu - Aşağıdaki şekillerden daha fazla renk vardır:

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

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

shape değeri ile bitebileceğini Bu değer tanımlanmamış olsa bile 2.

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"); 
    } 
} 
+1

+1 önemlidir, ancak çoğu zaman göz ardı edilir, enumda tanımlanmayan bir değer atayabileceğinizi belirtin. –

4

Her enum üye her biri karşılık gelen bir tamsayı değerine sahiptir.
Varsayılan olarak, bu değerler 0 ile başlayarak artan sırada atanır. (Dolayısıyla onların sayısal değerler) çeteleler öğelerin sırası aynıysa

, sadece aynı değere sahip EnumB üyesini almak için EnumB sayısal değer dağıtmak edebilirsiniz:

EnumBProperty = (EnumB)(int)EnumAProperty; 

EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString()); 
0

Sen tam sayıya döküm veya bir dizeye dönüştürmek ve daha sonra üzerine bir Enum.Parse yapabileceği ya:

Bunun yerine, eşlemek bir switch deyimi kullanın öneririm.

0

aşağıdaki deneyin:

EnumAProperty = (EnumA)Enum.Parse(typeof(EnumA), EnumBProperty.ToString); 
1

sürece farklı tipte her iki enum yıllardan olarak doğrudan atamak can'not. Eğer tamsayı değeri

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

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

EnumBPropertry = (int)EnumAProperty 
+0

Birisi, enumun tanımını birini değiştirip diğerini değiştirene kadar sorun değil. –

0
EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString()); 
İlgili konular