遍历System.Drawing.Color结构
日期: 2010-01-19 类别: 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
Stat.