![](/img/trans.png)
[英]How to get System.Drawing.Color from EPPlus's ExcelColor
[英]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.