System.Drawing.Color 已知姓名

System.Drawing.Color ToKnownName

我需要 System.Drawing.Color.FromKnownName 的相反函数,将 System.Drawing.Color.Red 转换为 "Red" 或 "red"。

提供示例代码:

    private static XElement BlipToXml(Blip blip)
    {
        var tmp = new XElement("Blip",
           new XAttribute("X", blip.Position.X),
           new XAttribute("Y", blip.Position.Y),
           new XAttribute("Z", blip.Position.Z),
           new XAttribute("color", blip.Color.), <-- This is where i need the ToKnownName
           new XAttribute("transparency", blip.Alpha),
           new XAttribute("sprite", blip.Sprite));
        tmp.SetValue(blip.Name);
        return tmp;
    }
    private static Blip XmlToBlip(XElement xml)
    {
        var x = float.Parse(xml.Attribute("X").ToString());
        var y = float.Parse(xml.Attribute("Y").ToString());
        var z = float.Parse(xml.Attribute("Z").ToString());
        var coords = new Vector3(x,y,z);
        var tmp = new Blip(coords);
        tmp.Color = System.Drawing.Color.FromName(xml.Attribute("color").ToString());
        tmp.Alpha = float.Parse(xml.Attribute("transparency").ToString());
        tmp.Sprite = (BlipSprite)Enum.Parse(typeof(BlipSprite), xml.Attribute("sprite").ToString());
        tmp.Name = xml.Value;
        return tmp;
    }

此方法使用反射来检查 Color class 上的预定义颜色,并将它们与作为参数传入的颜色进行比较。

private static String GetColorName(Color color)
{
    var predefined = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static);
    var match = (from p in predefined where ((Color)p.GetValue(null, null)).ToArgb() == color.ToArgb() select (Color)p.GetValue(null, null));
    if (match.Any())
       return match.First().Name;
    return String.Empty;
}