2013-04-08 47 views
1

我试图在C#中创建一个方法,该方法从组合框输入字符串值并返回一个颜色对象。我已经建立了如何使用if/else语句来比较字符串并返回颜色对象,但我想减少我写的代码量。输入字符串输出颜色对象c的方法#

public static ColorBeingReturned(string TextFromBox) 
{ 
    newcolor = Color.TextFromBox; 
    return newcolor; 
} 

我敢肯定的代码是所有不正确的,但它给你什么,我试图做一个想法。以下是我对if/else语句的一个片段。

public object ColorBeingReturned(string TextFromBox) 
{ 
    if (TextFromBox == "Red") 
     return Color.Red; 
    else if (TextFromBox == "Blue") 
     return Color.Blue; 
    else 
     return Color.White; 
} 

的基本上不必编写所有这些,如果else语句我宁愿几个语句,这样的方式,如果我增加额外的颜色列表中这将是一个更容易的过渡。

+0

如何使用组合框代替文本框?您可以使用预定义的值,代码将很简单。而且它不会允许用户输入错误的数据。 – 2013-04-08 13:45:11

+0

'return Color.FromName(TextFromBox);' – 2013-04-08 13:45:46

+0

我目前有一个组合框。我只是从组合框中拖动文本以进行颜色计算。 – Renstar 2013-04-08 13:47:43

回答

8

您可以使用Color.FromName(TextFromBox)方法。

http://msdn.microsoft.com/en-us/library/system.drawing.color.fromname.aspx

您也可以使用反射

public Color ColorBeingReturned(string TextFromBox) 
{ 
    return (Color)(typeof (Color) 
        .GetProperty(TextFromBox, 
         BindingFlags.Static| 
         BindingFlags.Public| 
         BindingFlags.GetProperty)) 
        .GetValue(null, null); 
} 
+0

这是很好,除非你不打算翻译UI变成另一种语言。此时,您需要在UI上的字符串和基底中的* real *颜色之间进行映射。 – Tigran 2013-04-08 13:48:45

+0

从ILSpy,'Color.FromName'内部使用一个Hashtable。使用反射应该慢得多,不值得。 – 2013-04-08 13:52:04

+0

是的,我只是反编译,看到'FromName'与缓存式机制的反射相同。所以,我同意反思似乎毫无用处(: – 2013-04-08 13:55:34

0

添加有效的颜色名称插入combo-box,并使用

Color.FromName(); 

例子:

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

对于有效的颜色名称填充组合框使用:

comboBox1.DataSource = Enum.GetValues(typeof(KnownColor)); 
0

如果这里的问题是有长if/else声明,它很容易通过使用字典而不是解决。

var textVsColor = new Dictionary<string,Color>(); 
textVsColor["Red"] = Color.Red; 
textVsColor["Green"] = Color.Green; 
... 

之后,而不是长期if/else,只是

public object ColorBeingReturned(string textFromBox) 
{ 
    var color = dfault(Color); 
    textVsColor.TryGetValue(textFromBox, out color); 
    return color; 
} 

这是你需要根据你的UI的当前语言有一个字符串,如果你需要支持多语言环境的情况下,一个很好的办法。