在C#中将字符串转换为Color

Kev*_*vin 60 .net c# xna

我遇到的问题是如何将输入字符串如"RED"转换为Color.RedC#中的实际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)

  • +1表示未找到匹配时的不同行为. (3认同)
  • @StingyJack:你不能要求OP改变他感兴趣的类型!不可否认,如果被告知*他有兴趣从什么类型开始,那将是很好的... (3认同)

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.OrdinalIgnoreCaseToDictionary调用中传递类似额外参数的内容.您可以根据需要轻松添加TryParse等方法.

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


Dav*_*vy8 7

由于他在评论中提到的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)


pr0*_*g3r 7

这取决于你正在寻找什么,如果你需要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)