-
C#用dynamic一行代码实现反射操作
dynamic简介
dynamic是.NET Framework4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译时默认dynamic对象支持你想要的任何特性。
dynamic简化反射实现
使用dynamic来简化反射实现是一种比较常见的编程技巧,它可以减少代码的复杂性并提高可读性。下面是一个使用dynamic来简化反射实现的示例:
// 定义一个类
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; }
}
// 创建一个对象并设定属性值
var person = new Person
{
Name = "刘备",
Age = 30,
Gender = "男"
};
// 使用反射获取属性值
var type = person.GetType();
var properties = type.GetProperties();
foreach (var property in properties)
{
var value = property.GetValue(person);
Console.WriteLine($"{property.Name}:{value}");
}
// 使用dynamic来简化反射实现
dynamic dynamicPerson = person;
Console.WriteLine($"Name:{dynamicPerson.Name}, Age:{dynamicPerson.Age}, Gender:{dynamicPerson.Gender}");
//欢迎公众号:DOTNET开发跳槽,领取海量面试题
可以看到,使用dynamic来简化反射实现可以将代码变得更加简洁易读,同时也可以避免一些繁琐的反射操作。使用dynamic可能会带来一些性能上的损失,应该根据具体情况进行选择。具体会不会,下面实验一下。
dynamic与反射的性能对比
这里首先新建一个类和一个两数相加的方法,然后分别使用反射和dynamic来调用这个类的方法,并循环数次,来对比它们的性能。代码如下:
#region 反射和dynamic的对比
int times = 1000000;
DynamicTest reflectTest = new DynamicTest();
var addMethod = typeof(DynamicTest).GetMethod("Add");
Stopwatch watchl = Stopwatch.StartNew();
for (var i = 0;i< times; i++)
{ addMethod.Invoke(reflectTest, new object[] { 1, 2 }); }
Console.WriteLine($"反射耗时:{watchl.ElapsedMilliseconds}毫秒");
dynamic dynamicTest = new DynamicTest();
Stopwatch watch2 = Stopwatch.StartNew();
for (int i =0;i< times; i++)
dynamicTest.Add(1,2);
Console.WriteLine($"dynamic耗时:{watch2.ElapsedMilliseconds} 毫秒");
#endregion
//测试的类
public class DynamicTest
{
public string Name{get; set; }
public int Add(int a, int b)
{
return a + b;
}
}
//欢迎公众号:DOTNET开发跳槽,领取海量面试题
100万次的效果:
1万次的效果:
可见100万次循环的效果dynamic要好点,1万次反射耗时小于dynamic。为了效果,所以每一次实验运行两次。
结语
由上可以看出dynamic的确可以简化反射,让代码更加简洁,可读性更强。但是从对比来看,dynamic在低数量调用的使用上性能要比反射弱太多,比较大的数量调用来说它们不相上下。建议如果你的代码对性能要求不太高的情况下,可以使用dynamic来简化反射。
出处:https://www.cnblogs.com/xbhp/p/17349082.html
栏目列表
最新更新
博克-定制图例
博克-注释和图例
Bokeh–添加小部件
向博克图添加标签
将交互式滑块添加到博克图
在 Bokeh 中添加按钮
谷歌、微软、Meta?谁才是 Python 最大的金
Objective-C语法之代码块(block)的使用
URL Encode
go语言写http踩得坑
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
[SQL Server]按照设定的周别的第一天算任意
Linux下定时自动备份Docker中所有SqlServer数
六、Danfo.js 数据可视化
五、plotly.js 数据可视化
四、数据分析、清理、转化
三、Danfo.js 入门
第二部分:使用 Danfo.js 和 Dnotebook 的据分
一、现代 JavaScript 概述
javascript 第一部分:基础知识
零、前言
uni-app开发跨平台小程序开发的诸多坑【转
前端设计模式——桥接模式