2010-08-02 83 views
49

我遇到了一个问题,那就是如何将输入字符串(如“RED”)转换为C#中的实际颜色类型Color.Red。有没有一个好的方法来做到这一点?将字符串转换为C#中的颜色

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

回答

81
Color red = Color.FromName("Red"); 

的MSDN没有说这种或那种方式,所以有一个很好的机会,它是区分-敏感。 (更新:显然,它不是。)

据我所知,ColorTranslator.FromHtml也是。

如果Color.FromName无法找到匹配,则返回new Color(0,0,0);

如果ColorTranslator.FromHtml无法找到匹配,它抛出一个异常。

UPDATE:

由于您使用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); 
+0

嘿詹姆斯,thx为您的评论。因为我在XNA GameStudio中开发了这个功能,所以在我输入代码后,程序会报错: 错误1'Microsoft.Xna.Framework.Graphics.Color'不包含' FromName'并且没有扩展方法'FromName'接受类型'Microsoft.Xna.Framework.Graphics.Color'的第一个参数可以找到(你是否缺少using指令或程序集引用?)C:\ Users \ Guoguo \ Desktop \ MapWorld2 \ MapWorld \ GameObject.cs 194 27 MapWorld 你是什么错误?谢谢。 – Kevin 2010-08-02 20:35:01

+3

+1表示找不到匹配项时的不同行为。 – Davy8 2010-08-02 20:35:21

+0

Microsoft.Xna.Framework不是正确的命名空间。使用System.Drawing – StingyJack 2010-08-02 20:41:08

16
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red"); 

(如果你想接受HTML风格的十六进制颜色使用我的方法。)

-2

我用这样的事情之前:

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

这不是一个枚举。 – 2010-08-02 20:43:44

+0

@Jon我混淆了ConsoleColor。同样的逻辑仍然适用,虽然......对吗?而不是Enum.Parse()他可以对属性名称进行不区分大小写的比较并返回结果。 (显然删除了IsEnum检查)。 – Skyler 2010-08-02 20:48:52

+0

我认为每次反思找到财产都会比较痛苦。更好的是,海事组织,一次建立一本字典(根据我的答案)。 – 2010-08-02 20:55:05

14

(这真的是很好,如果你提到你有兴趣这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等方法。

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

+0

看起来像这是回答这个问题的最好方法:http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string – 2010-08-02 23:17:50

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 
} 
+0

第二行应该是: 颜色xnaColor =新颜色(systemColor.R,systemColor.G,systemColor.B,systemColor.A); 但我相信这是完成Robert所要求的最简单的方法。 – Romias 2010-08-02 20:53:39

+0

@Romias谢谢,修正。 – Davy8 2010-08-02 20:56:11

+0

...并且还应该添加适当的'return'语句:) – 2010-08-02 23:00:34

3

这很好地工作了我的需要;)希望有人可以用它....

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

对于通过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); 
2

最简单的方法:

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) 
} 
5

这取决于,你要找的,如果你有什么需要System.Windows.Media.Color(像WPF中)这很容易:

System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84