①定义一个匿名类和对象
int objA = 1;
string objB = "hello";
object anonymous = new { objA, objB };
在第三行中,我们即定义了一个拥有两个成员变量,一个是类型为int,变量名为objA,另一个类型为string,变量名为objB的类;也实例化了一个这个匿名类的对象anonymous,对象的成员变量objA的值为1,成员变量objB的值为“hello”。
②使用反射获取匿名类的对象的值
Type type = anonymous.GetType();
//获取到类的所有成员变量信息
PropertyInfo[] infos = type.GetProperties();
foreach(PropertyInfo info in infos){
string propertyType = info.PropertyType.ToString();
string propertyName = info.Name;
object propertyValue = info.GetValue(anonymous);
Console.WriteLine(propertyType + " " + propertyName + ":" + propertyValue);
}
a、获取对象的Type
b、使用对象的Type获取类的所有成员变量信息
c、遍历成员变量,通过生成的PropertyInfo对象的GetValue方法获取成员变量的值
d、PropertyInfo类可以获取每个成员变量的基本数据类型(info.PropertyType)及变量名(info.name)等信息
③匿名类和对象在linq表达式中的应用
定义一个类Cycle:
public class Cycle {
private int CycleIdx;
private int C1;
private int C2;
}
定义一个对象集合:
List<Cycle> cycleList = new List<Cycle>();
Cycle cycle = new Cycle(1, 1, 1);
cycleList.Add(cycle);
cycle = new Cycle(1, 2, 1);
cycleList.Add(cycle);
cycle = new Cycle(1, 3, 1);
cycleList.Add(cycle);
cycle = new Cycle(2, 1, 1);
cycleList.Add(cycle);
cycle = new Cycle(2, 2, 1);
cycleList.Add(cycle);
cycle = new Cycle(2, 3, 1);
cycleList.Add(cycle);
使用linq表达式的groupBy进行分组:
var groupByList = cycleList.GroupBy(s => s.CycleIdx);
foreach (var tmp in groupByList)
{
object key = tmp.Key;
foreach (Cycle cycleEach in tmp)
{
int c1 = cycleEach.C1;
Console.WriteLine(cycleEach.toString());
}
Console.WriteLine("这一组的key为" + key.ToString());
}
此时var tmp的类型是一个集合,里面是我们分组后的每一组的对象集合,这个集合有一个公共key为分组标志。
输出为:
分组标志为两个时进行分组:
var groupByList2 = cycleList.GroupBy(s => new { s.CycleIdx, s.C1 });
foreach (var tmp in groupByList2)
{
object key = tmp.Key;
foreach (Cycle cycleEach in tmp)
{
int c1 = cycleEach.C1;
Console.WriteLine(cycleEach.toString());
}
Console.WriteLine("这一组的key为" + key.ToString());
}
Console.ReadLine();
此时var tmp的类型也是一个集合,但是此时的公共key不再是一个值,而是一个匿名对象
输出如下:
在我们要对两个参数进行分组的时候,就需要用到匿名类和对象,将两个变量作为成员变量生成匿名类和匿名对象,并将匿名对象作为分组的标志。group by方法将匿名对象作为公共key返回。