将string转换为C#中的颜色

我遇到了一个问题,那就是如何将inputstring(如“RED”)转换为C#中的实际ColortypesColor.Red 。 有没有一个好的方法来做到这一点?

我可以考虑为每种颜色types使用switch语句和case语句,但我认为这不够聪明。

  Color red = Color.FromName("Red"); 

MSDN不会说这样或那样,所以很有可能它是区分大小写的。 (更新:显然,它不是。)

据我所知, ColorTranslator.FromHtml也是。

如果Color.FromName找不到匹配项,则返回new Color(0,0,0);

如果ColorTranslator.FromHtml找不到匹配项,则会引发exception。

更新:

由于您使用的是Microsoft.Xna.Framework.Graphics.Color,这有点棘手:

 using XColor = Microsoft.Xna.Framework.Graphics.Color; using CColor = System.Drawing.Color; CColor clrColor = CColor.FromName("Red"); XColor xColor = new XColor(clrColor.R, clrColor.G, clrColor.B, clrColor.A); 
 System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red"); 

(如果您想接受HTML风格的hex颜色,请使用我的方法。)

(如果你刚才提到了你感兴趣的Colortypes,那真的很不错…)

一个简单的方法就是通过reflection来build立一个字典:

 public static class Colors { private static readonly Dictionary<string, Color> dictionary = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static) .Where(prop => prop.PropertyType == typeof(Color)) .ToDictionary(prop => prop.Name, prop => (Color) prop.GetValue(null, null))); public static Color FromName(string name) { // Adjust behaviour for lookup failure etc return dictionary[name]; } } 

第一次查找的时候会比较慢(虽然它使用reflection来查找所有的属性),但是之后应该很快。

如果你想让它不区分大小写,你可以在ToDictionary调用中传入类似StringComparer.OrdinalIgnoreCase东西作为额外的参数。 你可以很容易地添加TryParse等方法,如果你想。

当然,如果你只需要在一个地方,不要打扰一个单独的课堂等:)

由于OP在评论中提到他使用的是Microsoft.Xna.Framework.Graphics.Color而不是System.Drawing.Color ,因此可以先创build一个System.Drawing.Color,然后将其转换为Microsoft.Xna.Framework.Graphics.Color

 public static Color FromName(string colorName) { System.Drawing.Color systemColor = System.Drawing.Color.FromName(colorName); return new Color(systemColor.R, systemColor.G, systemColor.B, systemColor.A); //Here Color is Microsoft.Xna.Framework.Graphics.Color } 

这取决于你在找什么,如果你需要System.Windows.Media.Color(就像在WPF中),这很简单:

 System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, eg #131A84 

这工作很好,我的需要;)希望有人可以使用它….

  public static Color FromName(String name) { var color_props= typeof(Colors).GetProperties(); foreach (var c in color_props) if (name.Equals(c.Name, StringComparison.OrdinalIgnoreCase)) return (Color)c.GetValue(new Color(), null); return Colors.Transparent; } 

对于通过xml-strings传递颜色,我发现:

 Color x = Color.Red; // for example String s = x.ToArgb().ToString() ... to/from xml ... Int32 argb = Convert.ToInt32(s); Color red = Color.FromArgb(argb); 

最简单的方法是:

 string input = null; Color color = Color.White; TextBoxText_Changed(object sender, EventsArgs e) { input = TextBox.Text; } Button_Click(object sender, EventsArgs e) { color = Color.FromName(input) } 

我以前用过这样的东西:

  public static T CreateFromString<T>(string stringToCreateFrom) { T output = Activator.CreateInstance<T>(); if (!output.GetType().IsEnum) throw new IllegalTypeException(); try { output = (T) Enum.Parse(typeof (T), stringToCreateFrom, true); } catch (Exception ex) { string error = "Cannot parse '" + stringToCreateFrom + "' to enum '" + typeof (T).FullName + "'"; _logger.Error(error, ex); throw new IllegalArgumentException(error, ex); } return output; }