编码技巧 --- 使用dynamic简化反射
引言
dynamic 是 Framework 4.0
就出现特性,它的出现让 C# 具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,默认 dynamic 对象支持开发者想要的任何特性。
dynamic 介绍
在C#中,dynamic是一种类型,它允许你在运行时动态地确定对象的类型。
使用dynamic类型可以使代码更加灵活,因为不需要在编译时知道对象的确切类型,而可以在运行时根据需要确定类型。
确保dynamic对象调用有效
但是正因为你不知道对象的确切类型,所以在编码时一定要注意,确保对象的类型和属性和方法的存在,否则代码可能会引发运行时异常。
比如以下代码:
static void Main(string[] args)
{
dynamic dynamicObject = new Person();
var attr1 = dynamicObject.Name;
var attr2 = dynamicObject.GetAge();
Console.ReadLine();
}
public class Person
{
public string Gender { get; set; }
public string Name { get; set; }
public int MakeMoney()
{
return 200;
}
}
上述在编译时是不会报错的,但是在运行时,执行第二句是没问题的,因为得到的 dynamicObject
对象是有 Name
,Gender
两个属性的,但是执行第三句时就会抛出异常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
,并提示 does not contain a definition for 'GetAge'
。
dynamic 与 var
有时候会将 var
关键字与 dynamic
进行对比,那么我觉得主要有以下几点:
var
用于在编译时推断变量类型,可以将其视为一种简写方式,将变量类型的声明推迟到编译时。而dynamic
则是一种在运行时动态确定对象类型的类型。它允许您在运行时调用对象的属性和方法,而不需要在编译时确定对象的确切类型。var
声明的变量在Visual Studio编译器中能够使用IntelliCode进行“智能提示”,因为Visual Studio编译器在此阶段是可以推断出其实际类型,而dynamic
类型的变量不可以进行”智能提示“。var
类型的变量可以使代码更加简洁和易于阅读,而使用dynamic
类型的变量则可以使代码更加灵活和动态。
使用 dynamic 简化反射
常规使用反射,调用上文中 Person
类 MakeMoney()
方法,如下:
Person person = new Person();
var method = typeof(Person).GetMethod("MakeMoney");
int moneys = (int)method.Invoke(person, null);
那如果使用 dynamic 进行简化,则像这样:
dynamic person = new Person();
int moneys = person.MakeMoney();
这样使用 dynamic 后,代码更简洁,而且也减少了一次拆箱操作。
基准测试工具 --- BenchmarkDotNet这篇文章中,介绍了使用 BenchmarkDotNet 来测试性能,接下来依然使用 BenchmarkDotNet 来测试以下,测试一下执行100000次,上述两种方式的区别:
static void Main(string[] args)
{
BenchmarkRunner.Run<BenchmarkTest>();
}
[SimpleJob(RunStrategy.ColdStart, iterationCount: 100000)]
[MemoryDiagnoser]
public class BenchmarkTest
{
[Benchmark()]
public int UseReflection()
{
Person person = new Person();
var method = typeof(Person).GetMethod("MakeMoney");
int moneys = (int)method.Invoke(person, null);
return moneys;
}
[Benchmark()]
public int UseDynamic()
{
dynamic person = new Person();
int moneys = person.MakeMoney();
return moneys;
}
}
看一下 BenchmarkDotNet 测试结果,从报告中能看出来,使用 Dynamic 方式的方法的平均执行时间(Mean)和内存分配(AllLocated)时远小于使用反射实现的。
结论
在相同数量级的反射实现和使用 Dynamic 方式实现, Dynamic 方式在执行时间或内存分配或代码简洁都是有优势的,所以推荐使用 dynameic 来简化反射实现。
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/17577054.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-07-24 免费文件存储分享网站合集
2022-07-24 Takeown、Cacls、Icacls-文件、文件夹夺权用法
2022-07-24 教你win7系统手动导入注册表获取管理员权限
2022-07-24 解决Win10账户没有了管理员权限
2018-07-24 在树莓派是安装并配置NTP服务
2017-07-24 双色球基础分析--SQL
2017-07-24 Windows 7 中的 God Mode