C#用dynamic一行代码实现反射操作

这篇具有很好参考价值的文章主要介绍了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来简化反射。

参考:微软官方文档,《改善C#程序的157个建议》文章来源地址https://www.toymoban.com/news/detail-423606.html

来源公众号:DotNet开发跳槽

到了这里,关于C#用dynamic一行代码实现反射操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • unity的C#学习——不安全代码(声明不安全代码块:实现C/C++指针的创建与相关操作)

    不安全代码(Unsafe code)是指 使用了指针变量的代码块 ,或者 执行需要访问非托管代码(unmanaged code)的操作 。 指针 是一个变量,其值为另一个变量的地址,即内存位置的直接地址。在C#中,不安全代码必须使用 unsafe 修饰符标记,并需要在编译时启用 AllowUnsafeCode 选项。

    2024年02月09日
    浏览(30)
  • 【创建型设计模式】C#设计模式之工厂模式,以及通过反射实现动态工厂。

    题目如下: 简单工厂实现: 上述代码给出了抽象基类的基本定义,和泛型工厂的实现方式,以及调用方式。 值得注意的是 where T : Car, new() 这个条件: where T : Car, new() 是对泛型类型参数 T 的约束。这个约束表明泛型类型参数 T 必须满足两个条件: T 必须是 Car 类或者其派生类

    2024年02月11日
    浏览(27)
  • 不写一行代码(一):实现安卓基于GPIO的LED设备驱动

    第1篇 :不写一行代码(一):实现安卓基于GPIO的LED设备驱动 第2篇 :不写一行代码(二):实现安卓基于PWM的LED设备驱动 第3篇:不写一行代码(三):实现安卓基于i2c bus的Slaver设备驱动 安卓设备驱动,本质上依旧还是Linux架构的驱动程序,基于Linux Kernel。在做安卓ROM开发的过程中

    2024年02月05日
    浏览(31)
  • 【android studio 简单配置多语言国际化app 一行代码实现切换语言】

    新版本的android studio配置多语言其实很简单,不过目前网上找到的几个博客都搞得很复杂,可能是版本比较老的时候出的方案,今天分享一下怎么一行代码切换语言. 1.切换语言你得先有语言对应的文本,推荐插件一键生成.在设置里搜索Androidlocalize,直接安装即可 2.安装好了以后右键

    2024年02月11日
    浏览(39)
  • C# dynamic 数据类型

    在C#中,dynamic是一种数据类型,它允许在运行时推迟类型检查和绑定。使用dynamic类型,可以编写更具灵活性的代码,因为它允许在编译时不指定变量的类型,而是在运行时根据实际情况进行解析。 dynamic类型的变量可以存储任何类型的值,并且可以调用任何方法和访问任何属

    2024年04月15日
    浏览(19)
  • 还在手动封装文件上传?快来试试这款一行代码实现多平台文件存储的工具!

    大家好,我是 Java陈序员 。 文件上传下载,是我们在开发中经常会遇到的需求! 无论是本地存储、还是云存储,我们可以自己封装 API 来实现功能。 今天,给大家介绍一款一行代码实现多平台文件存储的工具,开箱即用! 关注微信公众号:【Java陈序员】,获取 开源项目分

    2024年01月18日
    浏览(45)
  • 【Java练习题汇总】《第一行代码JAVA》多线程篇,汇总Java练习题——线程及多线程概念、Thread 类及 Runnable 接口、线程状态、synchronized同步操作...

    一、填空题 Java 多线程可以依靠________ 、________ 和________ 三种方式实现。 多个线程操作同一资源的时候需要注意________,依靠________ 实现,实现手段是:________ 和________,过多的使用,则会出现________ 问题。 Java 程序运行时,至少启动________ 个线程,分别是________ 和_

    2024年02月16日
    浏览(41)
  • Protobuf 反射技术简介

    对于反射大家应该不会陌生,如果你接触过一些框架(如 ORM、IOC、OSGi 等) 的内部实现,应该更能体会反射技术的应用可谓无处不在。 反射概念最早出现于人工智能领域,20 世纪 70 年代末被引入到程序语言设计中。1982 年 MIT 的 Smith, Brian Cantwell 在他的博士论文中最早提出了

    2024年01月22日
    浏览(30)
  • 【C#进阶】C# 反射

    序号 系列文章 11 【C#基础】C# 预处理器指令 12 【C#基础】C# 文件与IO 13 【C#进阶】C# 特性 ✋ 大家好,我是writer桑,本章为大家介绍 C# 中的 反射 。 反射 指的是程序可以 访问,检测和修改 它本身状态或行为的一种行为。 其中访问的目标包括程序集 1 、模块和类型对象等。可

    2024年03月15日
    浏览(42)
  • 【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。

       📝个人主页:哈__ 期待您的关注  我想要通过反射来打印如下效果的类信息。 Student类如下代码所示。  你是否有思路?如果你不了解反射的话,我来给大家简单的介绍一下反射的使用方法。 1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操

    2024年04月10日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包