我遇到的问题是如何将输入字符串如"RED"转换为Color.Red
C#中的实际Color类型.有没有办法做到这一点?
我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明.
Jam*_*ran 93
Color red = Color.FromName("Red");
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
Lar*_*nal 17
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");
Run Code Online (Sandbox Code Playgroud)
(如果要接受HTML样式的十六进制颜色,请使用我的方法.)
Jon*_*eet 15
(如果你提到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];
}
}
Run Code Online (Sandbox Code Playgroud)
对于第一次查找而言,这将相对较慢(虽然它使用反射来查找所有属性)但在此之后应该非常快.
如果您希望它不区分大小写,则可以StringComparer.OrdinalIgnoreCase
在ToDictionary
调用中传递类似额外参数的内容.您可以根据需要轻松添加TryParse
等方法.
当然,如果你只需要在一个地方,不要打扰单独的类等:)
由于他在评论中提到的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
}
Run Code Online (Sandbox Code Playgroud)
这取决于你正在寻找什么,如果你需要System.Windows.Media.Color(就像在WPF中)它很容易:
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
Run Code Online (Sandbox Code Playgroud)
小智 5
通过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);
Run Code Online (Sandbox Code Playgroud)