首页 > 编程语言 >C#用dynamic一行代码实现反射操作

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

时间:2023-04-24 12:55:27浏览次数:32  
标签:反射 Name C# dynamic int var public

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个建议》

来源公众号:DotNet开发跳槽

标签:反射,Name,C#,dynamic,int,var,public
From: https://www.cnblogs.com/xbhp/p/17349082.html

相关文章

  • Caesar一个全新的敏感文件发现工具
    https://github.com/0ps/Caesar 一 支持主流平台:得益于golang的跨平台优势。一次编译,到处运行。二 强大的并发:golang的并发独树一帜。12线程下能实现每秒千级请求。为了安全性,默认只设置了3线程。三 路径记忆功能:Caesar可以记忆路径的击中次数,下次运行的时候,击中次......
  • pydictor —— 一个强大实用的黑客暴力破解字典建立工具
    pydictor下载环境kalihttps://github.com/LandGrey/pydictor/下载玩解压,然后在pydictor文件夹下打开终端即可。他可以帮助我们快速的生成普通爆破字典、基于网站内容的自定义字典、社会工程学字典等等一系列高级字典还可以使用内置工具,对字典进行安全删除、合并、去重、合并并......
  • CS 520 Implementation & testing
    Homework3Implementation&testingYoumayworkwithothersonthisassignment.Eachprogrammingpair,however,mustsubmittheirowncodebase,clearlyspecifyingthecollaborators.Thecodebaseshouldbewritteninthepair’sownwords.Aprogrammingpa......
  • Appium desktop 保存不了 Saved Capability Sets(按钮置灰)解决办法!
     有很多小伙伴遇到过Appiumdesktop中SavedCapabilitySets0为置灰状态,输入参数后没有保存成功的情况(下图) 经过我的不断研究,终于找到了一个满意的解决办法!!!1.下载方法打开链接下载此应用:https://github.com/appium/appium-inspector/releases(对应系统下载最新版本即可)......
  • sb+activiti7实例<二>20230424
    一、版本问题 原Activiti的TijsRademakers团队去开发Flowable框架。现Activiti7是Salaboy团队开发的,内核使用的还是Activiti6,扩展了云化。Activiti5、Activiti6代码目前由Salaboy团队代为维护,目前官宣已经暂停维护  Activiti:Activiti在目前来看有点不思进取,核心功能......
  • eWebEditor 实现ctrl+v粘贴图片并上传、word粘贴带图片
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>......
  • Halcon图像的 OCR 识别&训练字符
    2.1识别OCR的流程和方法处理图像使得数字或是字母为白底黑字->创建字符识别句柄->识别->清除句柄      算子:read_ocr_class_mlp(:: FileName : OCRHandle)示例:read_ocr_class_mlp('Document_0-9A-Z_NoRej.omc',OCRHandle)'Document_0-9A-Z_NoRej.omc'(输入控制......
  • 基于原生alert或者confirm的样式修改
    <style>#alertModel{position:fixed;top:0;left:0;width:100%;height:100%;z-index:99999;background:rgba(0,0,0,0.6);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-alig......
  • 分享一个国内可用的免费ChatGPT网站
    https://blog.csdn.net/laichj/article/details/129901356背景ChatGPT作为一种基于人工智能技术的自然语言处理工具,近期的热度直接沸腾。作为一个程序员,我也忍不住做了一个基于ChatGPT的网站,免费!免登陆!!国内可直接对话ChatGPT,也有各种提供工作效率的工具供大家使用。上干货......
  • css 渲染优化的方式
    1、加载性能优化:css压缩、css单一样式、减少使用@import,而建议使用link;2、 选择器性能优化:避免使用通配规则*尽量少的去对标签进行选择,而是用class不要去用标签限定ID或者类选择符:ul#nav,应该简化为#nav尽量少的去使用后代选择器,降低选择器的权重值考虑继承3、渲染......