如何从“System.Drawing.Color”字符串中获取System.Type

时间:2009-06-03 12:43:08

标签: c# .net reflection .net-2.0

我有一些控件的xml存储属性

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

我想将其转换为其他人

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

System.Type.GetType(“System.Drawing.Color”)返回null。

问题是如何从字符串中正确获取颜色类型

(最好不要仅为Color属性做一个特殊情况)

更新

有时会手动编辑这个xml

4 个答案:

答案 0 :(得分:4)

使用Type.GetType()时,您需要指定程序集和类型名称,除非该类型位于mscorlib或当前正在执行的程序集中。

如果您知道它位于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
}

答案 1 :(得分:2)

您是否加载了System.Drawing程序集?你有参考吗?

答案 2 :(得分:2)

您是否自己以XML格式存储这些属性?如果是这样,那么在创建节点时只需编写对象的AssemblyQualifiedName而不是FullName。这给出了使用Type.GetType()

从字符串加载类型所需的程序集上下文信息

答案 3 :(得分: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枚举值...在序列化过程中需要保存。