2013-04-08 48 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的當前語言有一個字符串,如果你需要支持多語言環境的情況下,一個很好的辦法。