Преобразуйте строку для Раскрашивания C#

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

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

59
задан Kevin 3 March 2017 в 09:34
поделиться

5 ответов

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

В MSDN так или иначе не указано, поэтому велика вероятность, что здесь учитывается регистр. (ОБНОВЛЕНИЕ: по всей видимости, это не так.)

Насколько я могу судить, ColorTranslator.FromHtml тоже.

Если Color.FromName не может найти совпадение, он возвращает новый цвет (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);
93
ответ дан 24 November 2019 в 18:10
поделиться

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

        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;
    }
-2
ответ дан 24 November 2019 в 18:10
поделиться
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");

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

17
ответ дан 24 November 2019 в 18:10
поделиться

Поскольку 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
}
7
ответ дан 24 November 2019 в 18:10
поделиться

(Было бы неплохо, если бы вы указали, какой Цвет тип, который вас интересовал с самого начала ...)

Один простой способ сделать это - просто создать словарь с помощью отражения:

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 и т. Д., Если захотите.

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

15
ответ дан 24 November 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: