我遇到了一個問題,那就是如何將輸入字符串(如「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