2013-10-24 2 views
5

System.Drawing.Color 구조체를 반복하고 펜 목록을 초기화하는 데 사용하고 싶습니다. System.Drawing.Color 구조체를 반복하고 System.Drawing.Pen을 만들 때 사용하십시오.

나는 이런 식으로 시도했지만 필드의 형태는 피팅되지 않습니다 :

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)); 
      } 
     } 

이 저를 도와주세요.

+0

@mbeckish'Color'는 많은'정적 '속성을 가진 클래스이며'enum'이 아닙니다. –

답변

5

, 그들이있어 특성이 아닌 필드 :

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)); 
    } 
} 

이것은 내가 실행 해요 버전과 141 개 색상으로 Pen의 생산, 0123의 목록에 해당한다. Transparent이 있지만 Empty을 반환하지 않습니다. 또한 (float)1에서 1f으로 변경되었습니다. ffloat 리터럴 인 컴파일러에 1float으로 캐스팅하는 것보다 간결하게 알려줍니다.

+0

"투명"및 "제로"를 제거했습니다. 나는 체크하지는 않았지만, 그 명령이 처음에는 매우 다른 것으로 선택 되길 바랍니다. – user2799180

+0

주문을 일관성 있고 합리적으로 만들고 싶다면'GetProperties (...). OrderBy (x => x.Name)'와 같은 것을 할 수 있습니다. –

1

어쩌면 당신은 당신의 코드에서 이것을 변경하려고 할 수 있습니다

colorList.Add (새 System.Drawing.Pen ((컬러) field.GetValue (널), (플로트) 1));

field 그냥 FieldInfo 인스턴스이며이 정말 (MSDN에서) 무엇이다 :

는 필드의 특성을 검색하고 메타 데이터 필드에 대한 액세스를 제공합니다.

은 그러나 당신이 필요로하는 것은 당신이 할 수있는, Color인스턴스를 메타 데이터하지 얻을 것입니다 다음 코드 조각이 :

Color.Empty 제외
(Color)field.GetValue(null) 
관련 문제