C# 循环所有颜色?

C# 循环所有颜色?,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,我正在用C#(Windows-Phone-7)开发一个应用程序,我正在尝试做一些让我感到困惑的简单事情 我想循环使用颜色中的每种颜色,并将颜色名称写入文件(以及其他内容) 我有一些最简单的代码,我知道这些代码不起作用,但我写这些代码是为了开始: foreach (Color myColor in Colors) { } 当然,这给了我以下语法错误: “System.Windows.Media.Colors”是一个“类型”,但与“变量”一样使用 有办法做到这一点吗?看起来真的很简单 您可以使用此

我正在用C#(Windows-Phone-7)开发一个应用程序,我正在尝试做一些让我感到困惑的简单事情

我想循环使用颜色中的每种颜色,并将颜色名称写入文件(以及其他内容)

我有一些最简单的代码,我知道这些代码不起作用,但我写这些代码是为了开始:

foreach (Color myColor in Colors)
{
}
当然,这给了我以下语法错误:

“System.Windows.Media.Colors”是一个“类型”,但与“变量”一样使用


有办法做到这一点吗?看起来真的很简单

您可以使用此帮助器方法获取每个颜色的名称/值对的字典

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;
    }
公共静态字典GetStaticPropertyBag(类型t)
{
const BindingFlags flags=BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
var map=newdictionary();
foreach(t.GetProperties中的var prop(标志))
{
map[prop.Name]=prop.GetValue(null,null);
}
返回图;
}
用于:

var colors = GetStaticPropertyBag(typeof(Colors));

foreach(KeyValuePair<string, object> colorPair in colors)
{
     Console.WriteLine(colorPair.Key);
     Color color = (Color) colorPair.Value;
}
var colors=GetStaticPropertyBag(typeof(colors));
foreach(KeyValuePair颜色对)
{
Console.WriteLine(colorPair.Key);
Color Color=(Color)colorPair.Value;
}
助手方法的功劳归于

您可以使用获取颜色类型中的所有属性:

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

你可以通过使用这个代码来实现

     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);
        }
    }
List colors=newlist();
foreach(Enum.GetNames中的字符串colorName(typeof(KnownColor)))
{
//将颜色名称转换为已知颜色
KnownColor KnownColor=(KnownColor)Enum.Parse(typeof(KnownColor),colorName);
//检查knownColor变量是否为系统颜色
if(knownColor>knownColor.Transparent)
{
//把它加入我们的名单
颜色。添加(颜色名称);
}
}

也许你应该在GetProperties的末尾添加一个Where子句(以防万一),比如:
.GetProperties(…).Where(p=>p.PropertyType==typeof(Color))
或者类似的东西?@Alxandr:这是安全的,不需要额外的检查(在这种情况下)。颜色的所有公共属性都已为“颜色”类型。请看:好的,没有问题,那么:-)。只记得曾经有过类似的错误:-)@Alxandr:是的-如果不是这个特殊的案例,它可能很重要。然后你会在select中删除casting,并附加OfType?我以前从未使用过这个。这是Silverlight-System.Windows.Media.Color不支持KnownColors(即System.Drawing)。这段代码非常棒,而且工作得非常完美!好的表演,完美的解决方案!