遍历System.Drawing.Color结构

类别: C#, asp.net 查看评论

通过反射得到Color的所有颜色属性,然后以色块的形式显示出来。

基本实现

先创建页面,然后添加一个div,设置runat=”server”,id为container。

然后在后台文件里面定义一个Div类,继承自HtmlGenericControl,然后设置这个div的背景色和文字颜色。

public class Div : HtmlGenericControl
{
    private string name;
 
    public Div(Color color): base("div")
    {
        this.name = color.Name;
 
        this.InnerHtml = string.Format("{0}
RGB({1}, {2},  {3})", name, color.R, color.G, color.B);//设置文本
        this.Style.Add("color", string.Format("RGB({0}, {1},  {2})", 255 - color.R, 255 - color.G, 255 - color.B));//设置文本颜色
        this.Style.Add("background-color", string.Format("RGB({0}, {1},  {2})", color.R, color.G, color.B)); //设置背景颜色
    }
}

接下来在后台代码里面获取Color的所有静态属性,并创建Div,然后把Div添加到之前定义的container里面

protected void Page_Load(object sender, EventArgs e)
{
    Type t = typeof(Color);// 获取Color类型的Type实例
    PropertyInfo[] pi = t.GetProperties(BindingFlags.Static | BindingFlags.Public);//获取公共的静态属性
 
    List<Div> divs = new List<Div>();
    foreach (PropertyInfo p in pi)// 遍历
    {
        Color color = (Color)t.InvokeMember(p.Name, BindingFlags.GetProperty, null, typeof(Color), null);//使用InvokeMemeber获取属性,并强制转换为Color类型
 
        Div div = new Div(color);// 创建一个Div
        divs.Add(div);//添加到divs列表中
    }
 
    foreach (Div div in divs)
    {
        container.Controls.Add(div);// 遍历divs列表,把每个div都添加到container中
    }
}

现在基本已经完成了,可以添加css样式,以一个合适的方式显示出来。默认是按照颜色的名称来排序的,当然也可以通过颜色来排序。

为列表排序

在页面里面添加个RadioButtonList,将AutoPostBack设为true,然后在里面添加两个ListItem。同时在后台代码中添加个枚举SortBy,用来标识排序的方式。

public enum SortBy
{
    Name,
    Color
}

修改Div类,添加ColorValue字段来表示颜色的值,创建继承自IComparer的类ColorComparer并实现Compare。

public class ColorComparer : IComparer<Div>//继承IComparer<Div>
{
    private SortBy sort;
    public ColorComparer(SortBy sort)
    {
        this.sort = sort;
    }
 
    public int Compare(Div x, Div y)// 实现IComparer
    {
        if (sort == SortBy.Name)// 根据sort类型为依据,进行哪种排序
        {
            return x.name.CompareTo(y.name);
        }
        else
            return x.colorValue.CompareTo(y.colorValue);
    }
}

创建GetComparer方法

public static ColorComparer GetComparer()//默认按名字排序
{
    return new ColorComparer(SortBy.Name);
}
 
public static ColorComparer GetComparer(SortBy sort)
{
    return new ColorComparer(sort);
}

在Page_Load里面添加如下代码,来判断以何种方式排序:

SortBy sort;
if (!IsPostBack)//首次加载页面,默认以名字排序
{
    sort = SortBy.Name;
}
else//否则的话,按照选择的方式来排序
{
    sort = (SortBy)Enum.Parse(typeof(SortBy), RadioButtonList1.SelectedValue);
}

然后在输出到页面前,调用Sort方法:

divs.Sort(Div.GetComparer(sort));
 
foreach (Div div in divs)
{
    container.Controls.Add(div);
}

现在就全部完成了,可以再这里看看效果预览。

参考

http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx

发表评论