Подтвердить что ты не робот

Как преобразовать строку типа "Красный" в System.Windows.Media.Color?

Я знаю, что могу пройти длинный маршрут...

  • Добавление ссылки на System.Drawing
  • Создание System.Drawing.Color из строки
  • Создание System.Windows.Media.Color из ARGB-значений System.Drawing.Color.

Но это похоже на серьезный перебор.

Есть ли более простой способ?

4b9b3361

Ответ 1

var color = (Color)ColorConverter.ConvertFromString("Red");

Ответ 2

Новый и лучший ответ

Конечно, ColorConverter - это путь. Вызовите ColorConverter.ConvertFromString и произведите результат. По общему признанию, это будет включать бокс. Если вы хотите избежать бокса, постройте словарь, чтобы начать с стандартных имен (все еще используя ColorConverter), а затем используйте словарь для последующих поисков.

Оригинальный ответ

Вы можете довольно легко получить имена свойств и значения из System.Windows.Media.Colors один раз на карте:

private static readonly Dictionary<string, Color> KnownColors = FetchColors();

public static Color FromName(string name)
{
    return KnownColors[name];
}

private static Dictionary<string, Color> FetchColors()
{
    // This could be simplified with LINQ.
    Dictionary<string, Color> ret = new Dictionary<string, Color>();
    foreach (PropertyInfo property in typeof(Colors).GetProperties())
    {
        ret[property.Name] = (Color) property.GetValue(null);
    }
    return ret;
}

Это немного уродливо, но это одноразовый удар.

Ответ 4

Этот код позволяет быстрее преобразовать имя в класс Color:

public class FastNameToColor
{
    Dictionary<string, Color> Data = new Dictionary<string, Color>();

    public FastNameToColor()
    {
        System.Reflection.PropertyInfo[] lColors = typeof(System.Drawing.Color).GetProperties();

        foreach (PropertyInfo pi in lColors)
        {
            object val = pi.GetValue(null, null);
            if (val is Color)
            {
                Data.Add(pi.Name, (Color)val);
            }
        }
    }

    public Color GetColor(string Name)
    {
        return Data[Name];
    }
}

Вы можете развернуть этот код, чтобы перевести имя на Media.Color напрямую.