2009-06-03 3 views
4

나는어떻게 "System.Drawing.Color"문자열에서 System.Type을 얻을 수

<Prop Name="ForeColor" Type="System.Drawing.Color" Value="-16777216" /> 

내가 다른 사람으로 다시 변환 할 몇 가지 컨트롤의 XML 저장 속성이

System.Type type = System.Type.GetType(propertyTypeString); 
object propertyObj = 
    TypeDescriptor.GetConverter(type).ConvertFromString(propertyValueString); 

System.Type.GetType ("System.Drawing.Color")은 null을 반환합니다.

문제는 하나가 제대로

에 시간에서

업데이트

를 (그냥 컬러 속성에 대해 특별한 경우를 수행하는 것이 좋습니다되지 것) 문자열에서 색상 유형을 얻을 수있는 방법이다 이 XML을 손으로 편집 할 시간

+0

변경 사항은 색상 자체에 영향을주지 않습니다 (이 순간을 값 속성에 표시하는 경우) – jonny

답변

4

형식이 mscorlib이거나 현재 실행중인 어셈블리가 아니면 Type.GetType()을 사용할 때 어셈블리 이름과 형식 이름을 지정해야합니다. 당신이이 System.Drawing 어셈블리에 알고있는 경우

대신 Assembly.GetType() 사용할 수 있습니다 - 혹은 가능한 어셈블리의 전체 목록을 보면 :

Type type = candidateAssemblies.Select(assembly => assembly.GetType(typeName)) 
           .Where(type => type != null) 
           .FirstOrDefault(); 

if (type != null) 
{ 
    // Use it 
} 
else 
{ 
    // Couldn't find the right type 
} 
+0

AFAIK, GetType 메서드는 많은 것을 던져줍니다 ... 매개 변수 (throwOnErrors = false)를 제공하더라도 그들은 여전히 ​​(arrrrgh)를 던져 버리므로 Select의 내부 람다를 방어해야하므로 읽기 쉽고 명확하지 않습니다. –

+0

Assembly.GetType은 유형 이름을 찾았지만 종속성이 손상되거나 유형 이름 자체가 유효하지 않거나 널 (null) 한 경우에만 실제로 발생합니다. 특히 어셈블리에 형식이 포함되어 있지 않기 때문에 * throw하지 않습니다. 나는 그것이 아마 바람직한 행동이라고 생각한다. –

2

System.Drawing 어셈블리가로드되어 있습니까? 당신은 그것에 대한 참조가 있습니까?

+0

예. 나는 그것에 대한 참조를 가지고 있으며, 나는 그것이로드되어있는 것을 볼 수있는 선에 도달 할 무렵에. – jonny

2

가 자신 XML에서 이러한 속성을 저장하고 있습니까? 그렇다면 노드를 만들 때 FullName 대신 객체의 AssemblyQualifiedName을 작성하십시오. 그 문자열을 사용하여 문자열을로드하는 데 필요한 어셈블리 컨텍스트 정보를 제공합니다 Type.GetType()

+0

+1 전화하세요. 이것이 옵션이라면 여러 어셈블리를 검색하는 것보다 낫습니다. –

+0

예측 가능성 측면에서 더 낫지 만 가독성 측면에서 더 나쁩니다. 특히 버전 문자열 등이 포함 된 서명 된 어셈블리 인 경우 특히 그렇습니다. –

+0

아마도 System.Drawing의 경우에는 문제가되지 않지만 QualifiedName을 일부 이러한 어셈블리를 다른 버전으로 업그레이드 할 때 문제가 발생할 수 있습니다. –

0

아마도 그게 당신의 문제와 관련이 없을 수도 있지만 비슷한 것을 가지고 있습니다. XmlSerializer을 사용하여 Color를 serialize/deserialize해야했습니다. Internets를 검색하고 여러 저자의 지혜를 결합 후 나는 래퍼 클래스를 내놓았다 :

/// <summary> 
/// Color that can be xml-serialized 
/// </summary> 
public class SerializableColor 
{ 
    public int A { get; set; } 
    public int R { get; set; } 
    public int G { get; set; } 
    public int B { get; set; } 
    public int KnownColor { get; set; } 

    /// <summary> 
    /// Intended for xml serialization purposes only 
    /// </summary> 
    private SerializableColor() { } 

    public SerializableColor(Color color) 
    { 
     this.A = color.A; 
     this.R = color.R; 
     this.G = color.G; 
     this.B = color.B; 
     this.KnownColor = (int)color.ToKnownColor(); 
    } 

    public static SerializableColor FromColor(Color color) 
    { 
     return new SerializableColor(color); 
    } 

    public Color ToColor() 
    { 
     if (KnownColor != 0) 
     { 
      return Color.FromKnownColor((KnownColor)KnownColor); 
     } 
     else 
     { 
      return Color.FromArgb(A, R, G, B); 
     } 
    } 
} 

어쩌면 그것은 당신의 상황에 적용 할 수 있습니다. Color 클래스는 때때로 자체를 ARGB 값의 조합이 아닌 KnownColor enum 값으로 저장하기 때문에 직렬화 중에 보존해야합니다.

관련 문제