2011-01-29 70 views
2

我正在使用C#(Windows-Phone-7)中的應用程序,並試圖做一些簡單的事情讓我難住。循環所有顏色?

我想循環遍歷顏色中的每種顏色,並將顏色名稱寫入文件(以及其他內容)。

我的代碼最簡單的一點,我知道就不行,但我寫的上手:

foreach (Color myColor in Colors) 
{ 
} 

當然,這給了我下面的語法錯誤:

「系統.Windows.Media.Colors'是一個'類型',但是像'變量'一樣使用。

有沒有辦法做到這一點?看起來很簡單!

回答

7

您可以使用此輔助方法來獲取每種顏色的名稱/值對的字典。

public static Dictionary<string,object> GetStaticPropertyBag(Type t) 
    { 
     const BindingFlags flags = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; 

     var map = new Dictionary<string, object>(); 
     foreach (var prop in t.GetProperties(flags)) 
     { 
      map[prop.Name] = prop.GetValue(null, null); 
     } 
     return map; 
    } 

用途是:

var colors = GetStaticPropertyBag(typeof(Colors)); 

foreach(KeyValuePair<string, object> colorPair in colors) 
{ 
    Console.WriteLine(colorPair.Key); 
    Color color = (Color) colorPair.Value; 
} 

信貸的helper方法去 How can I get the name of a C# static class property using reflection?

+0

那段代碼真棒,並且工作完美!好的表演,完美的解決方案 – pearcewg 2011-01-29 02:49:46

6

您可以使用Reflection把所有的顏色中的屬性類型:

var colorProperties = Colors.GetType().GetProperties(BindingFlags.Static | BindingFlags.Public); 
var colors = colorProperties.Select(prop => (Color)prop.GetValue(null, null)); 
foreach(Color myColor in colors) 
{ 
    // .... 
+0

也許你應該在你的GetProperties的末尾添加一個Where子句(以防萬一),例如:`.GetProperties(...)。Where(p => p.PropertyType == typeof(Color))`或者類似的東西? – Alxandr 2011-01-29 02:13:48

+0

@Alxandr:這是安全的 - 不需要額外的支票(在這種情況下)。 Colors的所有公共屬性都已經是Color類型。請參閱:http://msdn.microsoft.com/en-us/library/system.windows.media.colors(VS.95).aspx – 2011-01-29 02:15:57

1

那麼你可以通過usi這個代碼。

 List<string> colors = new List<string>(); 

    foreach (string colorName in Enum.GetNames(typeof(KnownColor))) 
    { 
     //cast the colorName into a KnownColor 
     KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), colorName); 
     //check if the knownColor variable is a System color 
     if (knownColor > KnownColor.Transparent) 
     { 
      //add it to our list 
      colors.Add(colorName); 
     } 
    }