2009-06-03 21 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を返します。時間から

質問を更新

(それだけで色特性のための特別なケースをしない方がよいでしょう)1が正しく文字列

からカラータイプを得ることができる方法である

へこのXMLを手で編集するとき

+0

変更は色自体には触れません(この瞬間をValue属性で主演している場合にのみ) – 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の場合です。特に、アセンブリに型が含まれていないためにスローしません。私はそれがおそらく望ましい行動だと思う。 –

2

System.Drawingアセンブリをロードしていますか?あなたはそれに言及していますか?

+0

はい。私はそれへの参照を持っていると、私はそれが読み込まれていることがわかることができる行に到達する頃に。 – jonny

2

あなたはXMLで自分自身をこれらのプロパティを格納していますか?その場合は、ノードを作成するときに、FullNameの代わりにオブジェクトのAssemblyQualifiedNameを書き込んでください。これは、文字列から型をロードするために必要なアセンブリコンテキスト情報を提供します。Type.GetType()

+0

+1お電話ください。これがオプションの場合は、複数のアセンブリを検索するよりも優れています。 –

+0

予測性の点では優れていますが、特に可読性の点では悪いです。特に、バージョン文字列などで署名されたアセンブリの場合は、さらに悪いです。 –

+0

System.Drawingの場合は問題ではないかもしれませんが、それらのアセンブリを別のバージョンにアップグレードするときに問題に直面する可能性があります。 –

0

多分あなたの問題には関係ないかもしれませんが、私は似たようなものでした。 XmlSerializerを使ってColorをシリアル化/デシリアライズする必要がありました。インターネットの検索と数人の著者の知恵を組み合わせた後、私はラッパークラスを思い付いた:

/// <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値として保存することがあります。