Ответ 1
var color = (Color)ColorConverter.ConvertFromString("Red");
Я знаю, что могу пройти длинный маршрут...
Но это похоже на серьезный перебор.
Есть ли более простой способ?
var color = (Color)ColorConverter.ConvertFromString("Red");
Новый и лучший ответ
Конечно, 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;
}
Это немного уродливо, но это одноразовый удар.
System.Windows.Media.ColorConverter - это то, как это делает XamlReader.
var result = ColorConverter.ConvertFromString("Red") as Color;
Этот код позволяет быстрее преобразовать имя в класс 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
напрямую.
Fyi, еще один простой способ - использовать только встроенный статический класс, созданный компанией microsoft, ex Colors.Red
http://msdn.microsoft.com/en-us/library/windows/desktop/bb189018.aspx