2013-10-24 10 views
5

Tôi muốn lặp qua cấu trúc System.Drawing.Color và sử dụng nó để bắt đầu danh sách bút.Lặp lại thông qua System.Drawing.Color struct và sử dụng nó để tạo System.Drawing.Pen

Tôi đã thử nó như thế này, nhưng các loại lĩnh vực không phải là Fitting:

colorList = new List<System.Drawing.Pen>(); 

     foreach (var field in typeof(System.Drawing.Color).GetFields()) 
     { 
      if (field.FieldType.Name == "Color" && field.Name != null) 
      { 
       colorList.Add(new System.Drawing.Pen(field, (float)1)); 
      } 
     } 

Xin hãy giúp tôi ra ngoài.

+0

@mbeckish 'Màu' là một lớp có nhiều thuộc tính' tĩnh', không phải là 'enum'. –

Trả lời

5

Trừ Color.Empty, họ đang tính, không phải lĩnh vực :

var colorList = new List<System.Drawing.Pen>(); 

foreach (var prop in typeof(System.Drawing.Color).GetProperties(BindingFlags.Public | BindingFlags.Static)) 
{ 
    if (prop.PropertyType == typeof(System.Drawing.Color)) 
    { 
     colorList.Add(new System.Drawing.Pen((System.Drawing.Color)prop.GetValue(null), 1f)); 
    } 
} 

Điều này tạo ra Pen s với 141 màu với phiên bản Tôi đang chạy, phải tương ứng với danh sách tại Color Properties. Nó không trả lại Empty, mặc dù nó có Transparent. Ngoài ra, tôi đã thay đổi từ (float)1 thành 1f. f thông báo cho trình biên dịch là float theo nghĩa đen, chính xác hơn là đúc 1 đến float.

+0

Tôi đã xóa "Trong suốt" và "Không". Tôi đã không kiểm tra nhưng tôi hy vọng rằng thứ tự bằng cách nào đó được chọn là rất khác nhau ở đầu. – user2799180

+0

Nếu bạn muốn làm cho trật tự nhất quán và hợp lý, bạn có thể làm một cái gì đó như 'GetProperties (...). OrderBy (x => x.Name)'. –

1

lẽ bạn có thể cố gắng để thay đổi điều này trong mã của bạn:

colorList.Add (mới System.Drawing.Pen ((Màu) field.GetValue (null), (float) 1));

field chỉ là một trường hợp FieldInfo và đây là những gì nó thực sự là (từ MSDN):

phát hiện ra các thuộc tính của một trường và cung cấp quyền truy cập vào trường siêu dữ liệu.

Nhưng những gì bạn cần là để có được Color s trường hợp không siêu dữ liệu, bạn có thể làm điều đó với đoạn mã sau:

(Color)field.GetValue(null) 
Các vấn đề liên quan