C#匿名类、对象(Linq中应用)与反射

本文介绍了如何在C#中定义和使用匿名类和对象,详细阐述了通过反射获取匿名类对象的值的过程,并探讨了它们在Linq表达式中的应用,特别是在复杂分组场景中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

①定义一个匿名类和对象

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返回。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值