我有一些控件的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
答案 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枚举值...在序列化过程中需要保存。