C#利用反射遍历System.Drawing.Color所有已知颜色并显示

夏知夏
夏知夏
发布时间:2026-10-15| 3人浏览过
原创

面试时经常会被问到如何列出 System.Drawing.Color 下的所有颜色名称及取值。本文将通过 C# 反射机制,快速遍历 Color 结构体中的已知颜色(Known Colors),并将其以可视化面板的形式呈现出来。

实现思路与原理

System.Drawing.Color 类内部包含了大量预定义的颜色属性(如 AliceBlue, Navy 等)以及通用属性(如 FromArgb, R, G 等)。为了仅提取出真正的“已知颜色”,我们需要使用反射技术:

  1. 获取成员列表:通过 typeof(Color).GetMembers() 获取该类所有的公共成员。
  2. 筛选属性:仅保留 MemberTypes.Property 类型的成员,排除方法和其他类型。
  3. 验证是否为已知颜色:利用 Color.FromName(member.Name) 尝试转换,并通过 .IsKnownColor 属性确认该名称是否对应一个已知的内置颜色。
  4. 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#编程技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。