编码技巧 --- 使用dynamic简化反射

这篇具有很好参考价值的文章主要介绍了编码技巧 --- 使用dynamic简化反射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

dynamicFramework 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 对象是有 NameGender 两个属性的,但是执行第三句时就会抛出异常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ,并提示 does not contain a definition for 'GetAge'

dynamic 与 var

有时候会将 var 关键字与 dynamic 进行对比,那么我觉得主要有以下几点:

  1. var 用于在编译时推断变量类型,可以将其视为一种简写方式,将变量类型的声明推迟到编译时。而 dynamic 则是一种在运行时动态确定对象类型的类型。它允许您在运行时调用对象的属性和方法,而不需要在编译时确定对象的确切类型。
  2. var声明的变量在Visual Studio编译器中能够使用IntelliCode进行“智能提示”,因为Visual Studio编译器在此阶段是可以推断出其实际类型,而dynamic 类型的变量不可以进行”智能提示“。
  3. var 类型的变量可以使代码更加简洁和易于阅读,而使用 dynamic 类型的变量则可以使代码更加灵活和动态。

使用 dynamic 简化反射

常规使用反射,调用上文中 PersonMakeMoney()方法,如下:

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 来简化反射实现文章来源地址https://www.toymoban.com/news/detail-599347.html

到了这里,关于编码技巧 --- 使用dynamic简化反射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编码技巧——Sentinel的blockHandler与fallback

    本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法; 在查看源码前,查阅了相关的技术帖子(1. Sentinel的blockHandler与fallback的区别 2.Sentinel服务熔

    2024年02月14日
    浏览(36)
  • 编码技巧:如何在Golang中高效解析和生成XML

    在当今数据驱动的编程世界中,有效地处理各种数据格式是每个开发人员必备的技能之一。其中,XML(可扩展标记语言)作为一种广泛使用的标记语言,它的灵活性和可扩展性使其在配置文件、网络服务以及跨平台数据交换中占据重要地位。然而,对于刚接触Golang的开发者来

    2024年01月16日
    浏览(39)
  • 编码技巧 --- 如何实现字符串运算表达式的计算

    最近做一个配置的功能,需求是该配置项跟另一个整形配置项关联,具有一定的函数关系,例如有一个配置项是值为 N ,则另一配置 F 项满足函数关系 (F=2/(N+1)) 。这个函数关系是客户手动输入,只需要简单的四则运算,所以我们要做的就是判断四则运算表达式是否有效,且

    2024年02月13日
    浏览(43)
  • Python代码规范:代码规范整改和编码技巧-pylint扫描问题整改

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus   1. 遵循PEP8规范,确保代码的格式和风格一致性。这可以通过编辑器或工具来自动化。 2. 将代码拆分为小的、易于维护和重用的函数、类和

    2023年04月08日
    浏览(106)
  • HTTP简化版 API使用

    1.1、获取当前IP(限制 1200次 /小时) 用浏览器访问 http://ip.hahado.cn/simple/current-ip?username=usernamepassword=password URL上面加上用户名和密码 \\\"ip\\\": 字段是当前的外网IP (\\\"ip\\\":\\\"null\\\" 正在切换中,暂时没有IP) \\\"ttl\\\": 字段是ip可以使用的剩余时间(秒) 1.2、手动切换IP(限制 180次 /小时,间隔

    2023年04月09日
    浏览(48)
  • 【javaSE】 反射与反射的使用

    Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(

    2024年02月07日
    浏览(32)
  • 使用 @NoRepositoryBean 简化数据库访问

    在 Spring Data JPA 应用程序中管理跨多个存储库接口的数据库访问逻辑可能会变得乏味且容易出错。开发人员经常发现自己为常见查询和方法重复代码,从而导致维护挑战和代码冗余。幸运的是,Spring Data JPA 为这个问题提供了一个强大的解决方案: @NoRepositoryBean  注解。在本文

    2024年04月27日
    浏览(31)
  • Java开发中使用sql简化开发

    使用sql语句简化开发 引语:在Java开发中,我们更希望数据库能直接给我们必要的数据,然后在业务层面直接使用,所以写一个简单的sql语句有助于提高Java开发效率,本文由简单到复杂。 使用MySQL数据库,先创建一个简单的表 开始玩吧,先看原始数据 以上原始数据,是我们

    2024年02月16日
    浏览(34)
  • 数学_使用舒尔补简化矩阵求逆

    将矩阵化成上三角矩阵,左乘 ,示例解方程如下:   将矩阵化成上三角矩阵,左乘 ,示例解方程如下:  

    2024年02月07日
    浏览(50)
  • 使用MVVM Toolkit简化WPF开发

    最近. NET 8 的 WPF 推出了 WPF File Dialog改进,这样无需再引用 Win32 命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了。顺手写了一个小的 WPF 程序,在使用 Model-View-ViewModel(MVVM) 模式的时候,我不想使用 Prism 等重量级的框架,找了一个轻量级的 MVVM Community T

    2024年02月05日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包