C#利用反射遍历System.Drawing.Color所有已知颜色并显示
面试时经常会被问到如何列出 System.Drawing.Color 下的所有颜色名称及取值。本文将通过 C# 反射机制,快速遍历 Color 结构体中的已知颜色(Known Colors),并将其以可视化面板的形式呈现出来。
实现思路与原理
System.Drawing.Color 类内部包含了大量预定义的颜色属性(如 AliceBlue, Navy 等)以及通用属性(如 FromArgb, R, G 等)。为了仅提取出真正的“已知颜色”,我们需要使用反射技术:
- 获取成员列表:通过
typeof(Color).GetMembers()获取该类所有的公共成员。 - 筛选属性:仅保留
MemberTypes.Property类型的成员,排除方法和其他类型。 - 验证是否为已知颜色:利用
Color.FromName(member.Name)尝试转换,并通过.IsKnownColor属性确认该名称是否对应一个已知的内置颜色。 - UI 渲染:将符合条件的颜色名和色块添加到窗体控件中。
完整代码实现
以下是一个完整的 WinForms 窗体示例。点击按钮后,程序会清空现有面板并重新生成包含所有已知颜色的色块列表。
using System;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
public partial class Form1 : Form
{
// 创建一个流式布局面板用于显示颜色
private FlowLayoutPanel newPanel = new FlowLayoutPanel();
public Form1()
{
InitializeComponent();
// 配置面板属性:允许滚动、填满窗口、背景白色
newPanel.AutoScroll = true;
newPanel.Dock = DockStyle.Fill;
newPanel.BackColor = Color.White;
// 配置按钮位置固定在右下角
button1.Anchor = (AnchorStyles.Bottom | AnchorStyles.Right);
}
private void button1_Click(object sender, EventArgs e)
{
// 每次点击前清除旧内容
newPanel.Controls.Clear();
int count = 0;
// 反射遍历 Color 类的所有成员
foreach (var item in typeof(Color).GetMembers())
{
// 条件1: 必须是 Property 类型
// 条件2: 转换后的颜色必须是 IsKnownColor (已知的内置颜色)
// 这会自动过滤掉 R, G, B, A, Name 等元数据属性
if (item.MemberType == MemberTypes.Property &&
System.Drawing.Color.FromName(item.Name).IsKnownColor)
{
// 创建显示颜色的 Label
Label myLabel = new Label();
myLabel.AutoSize = true;
string colorName = item.Name;
// 设置背景为对应颜色,文本为颜色名称
myLabel.BackColor = System.Drawing.Color.FromName(colorName);
myLabel.Text = colorName;
// 将标签加入面板
newPanel.Controls.Add(myLabel);
count++;
}
}
// 将面板添加到窗体
this.Controls.Add(newPanel);
// 在按钮上显示找到的颜色总数
button1.Text = "共找到 " + count.ToString() + " 种已知颜色";
}
}
第1步:初始化界面布局
在构造函数中,我们实例化了 FlowLayoutPanel。相比传统的表格或列表,流式布局能自动处理换行,适应不同屏幕尺寸。关键参数包括:
AutoScroll = true:当颜色数量超过可视区域时,自动显示滚动条。Dock = DockStyle.Fill:让面板占据除按钮外的所有剩余空间。
第2步:执行反射逻辑获取颜色
核心逻辑位于 button1_Click 事件中。通过 LINQ 风格的 foreach 循环结合反射 API:
typeof(Color).GetMembers() 返回当前类所有公开成员的数组。
判断 member.Type == MemberTypes.Property 确保只处理属性。
Color.FromName(name).IsKnownColor 是关键的过滤器,它排除了诸如 FromArgb、R、G 等非具体颜色值的元数据。
第3步:动态渲染 UI 元素
对于每个筛选出的有效颜色名(如 AliceBlue):
1. 新建 Label 控件。
2. 设置其 BackColor 为该实际颜色。
3. 设置其 Text 属性为颜色名称字符串。
4. 调用 newPanel.Controls.Add() 将其添加到底层容器中。
结果说明
运行代码后,窗体会显示数百个彩色小方块,每个方块代表一种内置颜色,下方标有对应的英文颜色名。这种方式不仅解决了面试问题,也提供了一个快速查找特定 RGB 组合对应的中文/英文命名的实用工具。相比手动查阅 MSDN 文档,这种方式更具交互性和直观性。
以上就是利用C#反射遍历System.Drawing.Color所有已知颜色的详细内容,更多关于C#编程技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









