匿名类型与Select方法实现自定义对象插入局部表结构中
在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITLE },这样的类型就叫匿名类型
var comdList = _menuMan.Load(c => c.FATHER_ID == null).OrderBy(c=>c.VAL_DISPLAYORDERID).Select(c=>new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITLE }).ToList();
//注意下面这种对象声明方法叫匿名类型,不事先定义类或结构,而直接创建其对象。
//它与上面的Select对应,因为Select方法相当于创建了一种不同于初始表结构的新类型,要往其中添加成员,只能用这种匿名类型的方法。
//上面的Select也可写成Select(c=>new { id=c.SYS_COMMANDS_ID, name=c.TXT_COMMANDTITLE }),下面的匿名类型定义时也要把名称SYS_COMMANDS_ID改成id等
//创建该匿名类型的另一个自定义对象,并插入到0位置
var sys = new { SYS_COMMANDS_ID = 0, TXT_COMMANDTITLE = "顶层菜单" };
comdList.Insert(0, sys);
//控件数据源绑定这样的匿名类型做数据源
combRootMenu.DisplayMember = "TXT_COMMANDTITLE";
combRootMenu.ValueMember = "SYS_COMMANDS_ID";
combRootMenu.DataSource = comdList;
扩展:比较两个匿名对象时,应该用Equal和不能用==运算符,因为前者是比较值,后者是比较地址。如:
// 构建两个匿名类型,拥有相同的名称/值对
var worker1 = new { FirstName = "Harry", SecondName = "Folwer", Level = 2 };
var worker2 = new { FirstName = "Harry", SecondName = "Folwer", Level = 2 };
这时,
worker1.Equals(worker2)是成立的,而
worker1==worker2不成立。