c# - 数组转字符串 - decimal转int




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

我遇到的问题是如何将输入字符串如“RED”转换为C#中的实际Color类型Color.Red 。 有没有办法做到这一点?

我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明。


(如果您提到了您感兴趣的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等方法。

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


为了通过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)
}

由于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
}

这很好地满足了我的需求;)希望有人可以使用它....

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

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




xna