2011-08-11 75 views
5

Tôi có hai đối tượng C# rất giống nhau nhưng không giống nhau. Tôi đang sao chép các giá trị từ lớp này sang lớp khác.C# Sao chép Đếm từ một đối tượng này sang một đối tượng khác

Mỗi lớp có một số thuộc tính hiển thị loại điều tra. Phần bên trong của các liệt kê đều giống nhau nhưng các tên khác nhau, ví dụ:

public enum EnumA 
{ 
A, 
B 
} 

public EnumA EnumAProperty 
{ 
get{ return enumA;} 
} 

public enum EnumB 
{ 
A, 
B 
} 

public EnumB EnumBProperty 
{ 
get{ return enumB;} 
} 

Tôi muốn gán giá trị trả về từ EnumBProperty cho EnumAProperty là điều này có thể?

+0

Và vâng tôi biết tôi cần một bộ! – AJM

+0

hmmm không chắc chắn nếu kiểu enum tương thích theo cách đó ... –

+0

trừ khi bạn gán giá trị cho các thành viên enum và nhận giá trị của EnumA và gán giá trị đó cho EnumB. Liệu điều đó có hiệu quả? –

Trả lời

4

bạn có thể làm qua đúc nhưng tôi sẽ không khuyên bạn nên nó vì nó là mong manh - nếu có của các thành viên enum được sắp xếp lại hoặc các mục mới được bổ sung kết quả có thể không là những gì bạn mong đợi.

EnumAProperty = (EnumA) EnumBProperty; 

Thậm chí tệ hơn với việc chọn diễn viên là nếu bạn có các mục trong enum nguồn của bạn không có tương đương trong các điểm đến - bên dưới có nhiều màu sắc hơn so với hình dạng:

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

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

shape có thể kết thúc với giá trị 2 mặc dù giá trị này không được xác định.

Thay vào đó, tôi muốn đề nghị bạn sử dụng một tuyên bố switch để lập bản đồ:

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 cho ver quan trọng, nhưng thường bị bỏ qua, điểm mà bạn có thể gán một giá trị không được xác định trong enum. –

4

Mỗi thành viên enum có giá trị số nguyên tương ứng.
Theo mặc định, các giá trị này được chỉ định theo thứ tự tăng dần, bắt đầu bằng 0.

Nếu thứ tự của các mục trong sự đếm (và do đó giá trị số của họ) là như nhau, bạn chỉ có thể đúc các giá trị số để EnumB để có được những EnumB thành viên có giá trị như nhau:

EnumBProperty = (EnumB)(int)EnumAProperty; 

Nếu không, bạn cần phải phân tích nó:

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

Bạn có thể có thể bỏ nó vào một số nguyên hoặc chuyển đổi nó thành một chuỗi và sau đó làm một Enum.Parse trên đó.

0

Hãy thử như sau:

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

Chừng nào cả của enum các loại khác nhau mà bạn can'not gán nó trực tiếp. Bạn có thể xác định số nguyên bù đắp cho một mục để bạn có thể gán giá trị thông qua các giá trị số nguyên

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

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

EnumBPropertry = (int)EnumAProperty 
+0

Đó là ok, cho đến khi ai đó thay đổi định nghĩa của enum trong một nhưng không phải là khác. –

0
EnumBProperty = (EnumB)Enum.Parse(typeof(EnumB), EnumAProperty.ToString()); 
Các vấn đề liên quan