Convierte cadena a Color en C #

Me encuentro con un problema que es cómo convierto cadenas de entrada como “ROJO” al color real Tipo Color.Red en C #. ¿Existe una forma correcta de hacer esto?

Podría pensar en usar una statement de cambio y una statement de casos para cada tipo de color, pero no creo que sea lo suficientemente inteligente.

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

MSDN no lo dice de una manera u otra, por lo que hay muchas posibilidades de que distinga entre mayúsculas y minúsculas. (ACTUALIZACIÓN: Aparentemente, no lo es)

Por lo que puedo decir, ColorTranslator.FromHtml también lo es.

Si Color.FromName no puede encontrar una coincidencia, devuelve un new Color(0,0,0);

Si ColorTranslator.FromHtml no puede encontrar una coincidencia, arroja una excepción.

ACTUALIZAR:

Como usa Microsoft.Xna.Framework.Graphics.Color, esto se vuelve un poco complicado:

 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"); 

(Utilice mi método si quiere aceptar colores hexadecimales de estilo HTML).

(Realmente hubiera sido bueno si hubieras mencionado qué tipo de Color te interesaba para empezar …)

Una forma simple de hacer esto es simplemente construir un diccionario a través de la reflexión:

 public static class Colors { private static readonly Dictionary 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]; } } 

Eso será relativamente lento para la primera búsqueda (mientras usa el reflection para encontrar todas las propiedades) pero debe ser muy rápido después de eso.

Si desea que no StringComparer.OrdinalIgnoreCase entre mayúsculas y minúsculas, puede pasar algo como StringComparer.OrdinalIgnoreCase como argumento adicional en la llamada a ToDictionary . Puede agregar fácilmente métodos TryParse etc., si lo desea.

Por supuesto, si solo necesitas esto en un solo lugar, no te molestes con una clase separada, etc. 🙂

Dado que OP mencionó en un comentario que está usando Microsoft.Xna.Framework.Graphics.Color lugar de System.Drawing.Color , primero puede crear un System.Drawing.Color y luego convertirlo a 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 } 

Depende de lo que esté buscando, si necesita System.Windows.Media.Color (como en WPF) es muy fácil:

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

Para transferir colores a través de xml-strings he descubierto:

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

Esto funcionó muy bien para mis necesidades;) Espero que alguien pueda usarlo …

  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; } 

La forma más simple:

 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) } 

He usado algo como esto antes:

  public static T CreateFromString(string stringToCreateFrom) { T output = Activator.CreateInstance(); 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; }