Я встречаюсь с проблемой, которая является, как я преобразовываю входные строки как "КРАСНЫЙ" к фактическому Типу цвета Color.Red
в C#. Существует ли хороший способ сделать это?
Я мог думать об использовании оператора переключения и оператора случаев для каждого типа цвета, но я не думаю, что это достаточно умно.
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);
Я использовал что-то подобное раньше:
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;
}
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");
(Используйте мой метод, если вы хотите принять HTML-стиль шестнадцатеричных цветов. )
Поскольку 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
}
(Было бы неплохо, если бы вы указали, какой Цвет
тип, который вас интересовал с самого начала ...)
Один простой способ сделать это - просто создать словарь с помощью отражения:
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
и т. Д., Если захотите.
Конечно, если вам это нужно только в одном месте, не беспокойтесь о отдельном классе и т. Д. :)