我遇到了一个问题,如何将输入的字符串“RED”转换为C#中实际的颜色类型
我可以考虑使用switch语句和每个颜色类型的case语句,但我认为这不够聪明。
Color.Red
?有没有更好的方法?我可以考虑使用switch语句和每个颜色类型的case语句,但我认为这不够聪明。
Color red = Color.FromName("Red");
根据MSDN上的内容,无法确定是否对大小写敏感,因此很可能是对大小写敏感的。(更新:显然不是。)
据我所知,ColorTranslator.FromHtml
也是区分大小写的。
如果 Color.FromName
找不到匹配项,则返回 new Color(0,0,0);
如果 ColorTranslator.FromHtml
找不到匹配项,则会抛出异常。
更新:
由于你正在使用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样式的十六进制颜色,请使用我的方法。)
如果一开始您能提出对哪种Color
类型感兴趣就好了……
一个简单的方法是通过反射构建一个字典:
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];
}
}
首次查找会比较慢(因为它需要使用反射来查找所有属性),但之后应该非常快。
如果你希望不区分大小写,可以在ToDictionary
调用中传递类似StringComparer.OrdinalIgnoreCase
的额外参数。如果需要,可以轻松添加TryParse
等方法。
当然,如果你只需要在一个地方使用,就不必费心创建单独的类等等 :)
这取决于你正在寻找什么,如果你需要System.Windows.Media.Color(比如在WPF中),那么非常容易:
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
由于OP在评论中提到他正在使用Microsoft.Xna.Framework.Graphics.Color
而不是System.Drawing.Color
,因此您可以首先创建一个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
}
return
语句 :) - Peter Lillevold我发现通过xml字符串传输颜色的方法如下:
Color x = Color.Red; // for example
String s = x.ToArgb().ToString()
... to/from xml ...
Int32 argb = Convert.ToInt32(s);
Color red = Color.FromArgb(argb);
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;
}
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)
}
Color beige = StringToColor("Beige");
Color purple = StringToColor("#800080");
Color window = StringToColor("Window");
public static Color StringToColor(string colorStr)
{
TypeConverter cc = TypeDescriptor.GetConverter(typeof(Color));
var result = (Color)cc.ConvertFromString(colorStr);
return result;
}
我以前用过类似的东西:
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;
}
System.Drawing.Color
中的颜色集与XNAColor
类型中的颜色集相同。这可能是真的,也可能不是...并且可能很重要(OP可能对System.Drawing
中的颜色范围感到满意)。 - Jon Skeet