将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颜色,请使用我的方法。)
(如果你刚才提到了你感兴趣的Color
types,那真的很不错…)
一个简单的方法就是通过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; }