我遇到了一个问题,那就是如何将输入字符串(如“RED”)转换为C#中的实际颜色类型Color.Red
。有没有一个好的方法来做到这一点?将字符串转换为C#中的颜色
我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明。
我遇到了一个问题,那就是如何将输入字符串(如“RED”)转换为C#中的实际颜色类型Color.Red
。有没有一个好的方法来做到这一点?将字符串转换为C#中的颜色
我可以考虑为每种颜色类型使用switch语句和case语句,但我认为这不够聪明。
Color red = Color.FromName("Red");
的MSDN没有说这种或那种方式,所以有一个很好的机会,它是区分-敏感。 (更新:显然,它不是。)
据我所知,ColorTranslator.FromHtml
也是。
如果Color.FromName
无法找到匹配,则返回new Color(0,0,0);
如果ColorTranslator.FromHtml
无法找到匹配,它抛出一个异常。
UPDATE:
由于您使用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);
System.Drawing.Color myColor = System.Drawing.ColorTranslator.FromHtml("Red");
(如果你想接受HTML风格的十六进制颜色使用我的方法。)
我用这样的事情之前:
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;
}
这不是一个枚举。 – 2010-08-02 20:43:44
@Jon我混淆了ConsoleColor。同样的逻辑仍然适用,虽然......对吗?而不是Enum.Parse()他可以对属性名称进行不区分大小写的比较并返回结果。 (显然删除了IsEnum检查)。 – Skyler 2010-08-02 20:48:52
我认为每次反思找到财产都会比较痛苦。更好的是,海事组织,一次建立一本字典(根据我的答案)。 – 2010-08-02 20:55:05
(这真的是很好,如果你提到你有兴趣这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];
}
}
这将是第一次查找相对缓慢(虽然它使用反射来发现所有的属性),但应该是非常快之后。
如果您希望它不区分大小写,您可以在ToDictionary
调用中传入类似StringComparer.OrdinalIgnoreCase
的内容作为额外参数。如果您愿意,可以轻松添加TryParse
等方法。
当然,如果你只需要这在一个地方,不要用一个单独的类等等:)
看起来像这是回答这个问题的最好方法:http://stackoverflow.com/questions/3392030/convert-a-xna-color-object-to-a-string – 2010-08-02 23:17:50
打扰由于在评论中提及的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 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;
}
对于通过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);
最简单的方法:
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)
}
这取决于,你要找的,如果你有什么需要System.Windows.Media.Color(像WPF中)这很容易:
System.Windows.Media.Color color = (Color)System.Windows.Media.ColorConverter.ConvertFromString("Red");//or hexadecimal color, e.g. #131A84
嘿詹姆斯,thx为您的评论。因为我在XNA GameStudio中开发了这个功能,所以在我输入代码后,程序会报错: 错误1'Microsoft.Xna.Framework.Graphics.Color'不包含' FromName'并且没有扩展方法'FromName'接受类型'Microsoft.Xna.Framework.Graphics.Color'的第一个参数可以找到(你是否缺少using指令或程序集引用?)C:\ Users \ Guoguo \ Desktop \ MapWorld2 \ MapWorld \ GameObject.cs 194 27 MapWorld 你是什么错误?谢谢。 – Kevin 2010-08-02 20:35:01
+1表示找不到匹配项时的不同行为。 – Davy8 2010-08-02 20:35:21
Microsoft.Xna.Framework不是正确的命名空间。使用System.Drawing – StingyJack 2010-08-02 20:41:08