繁体   English   中英

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

[英]How can I get System.Type from “System.Drawing.Color” string

我有一些控件的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会不时地手工编辑

除非类型位于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
}

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

您是否自己以XML格式存储这些属性? 如果是这样,只需在创建节点时编写对象的AssemblyQualifiedName而不是FullName 这给出了使用Type.GetType()从字符串加载类型所需的程序集上下文信息

也许这与你的问题不完全相关,但我有一个类似的问题。 我需要使用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枚举值...需要在序列化期间保存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM