Преобразовать строку в цвет в C # - PullRequest
57 голосов
/ 03 августа 2010

Я столкнулся с проблемой, которая заключается в том, как преобразовать входные строки, такие как "КРАСНЫЙ", в фактический тип цвета Color.Red в C #.Есть ли хороший способ сделать это?

Я мог бы подумать об использовании оператора switch и case для каждого типа цвета, но я не думаю, что он достаточно умен.

Ответы [ 9 ]

90 голосов
/ 03 августа 2010
 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);
16 голосов
/ 03 августа 2010
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");

(Используйте мой метод, если хотите принять шестнадцатеричные цвета в стиле HTML.)

15 голосов
/ 03 августа 2010

(Было бы неплохо, если бы вы упомянули, какой тип 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];
    }
}

Это будет относительно медленно для первого поиска (хотя для поиска всех свойств будет использоваться отражение), но после этого оно должно быть очень быстрым.

Если вы хотитечтобы быть нечувствительным к регистру, вы можете передать что-то вроде StringComparer.OrdinalIgnoreCase в качестве дополнительного аргумента в вызове ToDictionary.Вы можете легко добавлять TryParse и т. Д. Методы, если хотите.

Конечно, если вам нужно это только в одном месте, не беспокойтесь о отдельном классе и т. Д.)

7 голосов
/ 03 августа 2010

Поскольку ОП упоминается в комментарии, что он использует 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
}
6 голосов
/ 30 октября 2014

Это зависит от того, что вы ищете, если вам нужен System.Windows.Media.Color (как в WPF), это очень просто:

System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
4 голосов
/ 06 июня 2013

Для передачи цветов через 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);
3 голосов
/ 12 апреля 2012

Это хорошо сработало для моих нужд;) Надеюсь, кто-нибудь сможет его использовать ....

    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;
    }
2 голосов
/ 29 августа 2014

Самый простой способ:

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)
}
0 голосов
/ 03 августа 2010

Я использовал что-то подобное раньше:

        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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...