聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言

dynamic 是一种有别于传统变量类型的动态类型声明,刚开始接触可能在理解上会有些困难,可以简单地把它理解为一个盲盒,你可以任意猜测盒子有什么东西,并认为这些东西真正存在而进行处理,等到真正打开时,才能真正确定这些东西是不是真的存在。

所以,当使用 dynamic 声明一个变量时,编译器不会去检查该变量的成员或方法的有效性,换句话说,你可以调用任意成员或方法,即使它们不存在,编译器也不会报错,等到程序运行的时候,才会去解析,如果不存在,才会抛出错误。

dynamic 类型的这种特性,使得它在编程时非常灵活,很适合某些场景,比如与动态语言或COM互操作时,还有反射、JSON序列化/反序列化 等等。

下面分享一个将 dynamic 变量转为其它类型的技巧和实例。

Step By Step 步骤

  1. Linq 直接返回 List 变量

    c# 复制代码
    private List<dynamic> BaseDataOfYZ(
    	QueryParam param,
    	string[] uos,
    	string[] ugs,
    	string uoEM,
    	string ugEM,
    	string wType)
    {
    	var query = BaseDataQuery(param, uos)
    		.Select(x => new { x.wType, x.UO, x.UG })
    		.GroupBy(x => x.wType)
    		.Select(x => new
    		{
    			wType = wType,
    			UONum1 = x.Count(t => t.UO == uoEM),
    			UONum2 = x.Count(t => t.UO == ugEM),
    			WtNum = x.Count(t => ugs.Contains(t.UG))
    		}).ToList<dynamic>();
    
    	return query;
    }

    说明:

    这样的好处就是不需要去定义一个实体类,尤其是这个实体类只用在这一处的时候,这样就会很灵活和减少无用的代码。

  2. 在实际业务场景中再将 List 变量转为其它类型(留意注释

    c# 复制代码
    // 技巧:先 ToList - 再 Select new class - 最后再 ToList
    private List<WCoverDto> SummaryData(List<dynamic> list)
    {
    	var query2 = list
    		.Select(x => new { x.wType, x.UONum1, x.UONum2, x.WtNum })
    		.GroupBy(x => x.wType)
    		.Select(x => new
    		{
    			wType = x.Key,
    			UONum1 = x.Sum(t => t.UONum1),
    			UONum2 = x.Sum(t => t.UONum2),
    			WtNum = x.Sum(t => t.WtNum),
    		})
    		.ToList()
    		.Select(x => new WCoverDto
    		{
    			wType = x.wType,
    			UONum1 = x.UONum1,
    			UONum2 = x.UONum2,
    			Total = x.UONum1 + x.UONum2,
    			WtNum = x.WtNum
    		})
    		.ToList();
    
    	return query2;
    }

    说明:

    这是一个实际业务场景方法,对上一个方法产生的数据根据业务要求作进一步的处理,转成实际需要的对象类型

总结

dynamic 变量类型可以简化代码,处理动态数据时,可以方便地操作数据结构,但同时在使用中也要注意其缺陷,比如:

  1. 由于编译时无法进行类型检查,因此在运行时可能会出现类型转换错误或运行时异常。
  2. dynamic 类型在性能上可能会略逊于静态类型,因为它需要进行运行时绑定和解析。
  3. 过度使用 dynamic 可能会降低代码的可读性和维护性,因为编译器无法提供编译时的类型检查和智能感知。

总的来说,dynamic 类型在某些特定场景下能够提供方便和灵活性,但在使用时应慎重考虑其影响,避免在不必要的情况下使用 dynamic,只在确实需要动态类型绑定的情况下使用,最好地发挥 dynamic 类型的作用。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。

相关推荐
坐井观老天42 分钟前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
pchmi3 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭5 小时前
C#都可以找哪些工作?
开发语言·c#
boligongzhu6 小时前
Dalsa线阵CCD相机使用开发手册
c#
向宇it19 小时前
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
java·开发语言·unity·c#·游戏引擎·里氏替换原则
sukalot19 小时前
windows C#-命名实参和可选实参(下)
windows·c#
小码编匠19 小时前
.NET 下 RabbitMQ 队列、死信队列、延时队列及小应用
后端·c#·.net
我不是程序猿儿1 天前
【C#】Debug和Release的区别和使用
开发语言·c#
lzhdim1 天前
2、C#基于.net framework的应用开发实战编程 - 设计(二、二) - 编程手把手系列文章...
开发语言·c#·.net