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

来源公众号:DotNet开发跳槽

原文链接:https://www.cnblogs.com/xbhp/p/17349082.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#用dynamic一行代码实现反射操作 - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月28日

相关文章

  • C#类中属性与成员变量的使用小结

    请听我仔细讲解! C#类中属性与成员变量的使用小结 在开发C#应用程序的过程中,使用类是很常见的。类是描述对象行为和特征的模板,而属性和成员变量是类中最常用的元素之一。下面,我们将详细介绍C#类中属性与成员变量的使用。 成员变量 成员变量也称为字段,是类中用于存储数据的变量。成员变量可以在类的任何方法之外进行定义,这样就可以在整个类中使用。定义成员变量时,可…

    C# 2023年5月31日
    00
  • ASP.NET Core中间件实现限流的代码

    ASP.NET Core中间件实现限流的代码 在ASP.NET Core中,可以使用中间件来实现限流。本攻略将提供一些示例,演示如何在ASP.NET Core中使用中间件实现限流。 步骤 步骤1:创建ASP.NET Core Web API项目 首先,需要创建一个ASP.NET Core Web API项目。可以使用以下命令在命令行中创建一个新的ASP.NE…

    C# 2023年5月17日
    00
  • C#串口接收程序的实现

    C#串口接收程序的实现攻略 串口通信是一种常见的设备与计算机之间进行数据传输的方式。在C#中,我们可以使用SerialPort类来实现串口接收程序的实现。下面是实现串口接收程序的完整攻略: 1. 创建串口接收程序的项目 首先,我们需要创建一个新的C#项目。在Visual Studio中,可以通过选择“新建项目”并选择“控制台应用程序”来完成。在新建项目的过程…

    C# 2023年6月7日
    00
  • C# linq查询之动态OrderBy用法实例

    C# LINQ是一种处理数据的标准方式,而OrderBy方法则是集合操作中的一种常见方式,用于排序实例。在使用LINQ的时候,OrderBy方法除了提供常规的静态排序,还可以通过动态排序来满足更灵活的需求。 动态OrderBy方法概述 动态OrderBy方法可以接受一个字符串参数,以便动态指定排序依据。在字符串中传递排序依据属性名称,并指定排序的方式(升序或…

    C# 2023年6月1日
    00
  • C#实现的SQL备份与还原功能示例

    标题:C#实现的SQL备份与还原功能示例 介绍:本文提供了关于如何使用C#实现SQL数据库备份和还原的示例,包括备份和还原的代码示例和详细的步骤说明。 第一步。连接数据库 在C#中连接数据库需要使用System.Data.SqlClient命名空间。首先,我们需要新建一个SqlConnection对象,并对该对象设置连接字符串: using System.D…

    C# 2023年6月2日
    00
  • windows系统下,如何在C#程序中自动安装字体

    要在Windows系统下自动安装字体,可以在C#程序中使用System.Drawing.Text命名空间中的PrivateFontCollection和InstalledFontCollection类来实现。 具体步骤如下: 创建一个PrivateFontCollection对象,并使用AddFontFile方法向其中添加字体文件路径: using Syst…

    C# 2023年6月6日
    00
  • linq中的分组操作符

    当需要对查询结果进行分组时,我们可以使用LINQ中的分组操作符。常用的分组操作符有GroupBy、ToLookup等。 GroupBy操作符 GroupBy操作符将一个序列按照指定条件分成多个组,并返回每个组及其对应的元素集合。其语法为: IEnumerable<IGrouping<TKey, TSource>> GroupBy&lt…

    C# 2023年6月1日
    00
  • C#算法之整数反转

    C#算法之整数反转 1. 题目描述 给定一个32位有符号整数,将其进行反转,返回反转后的整数。 例如: 输入:123 输出:321 输入:-123 输出:-321 输入:120 输出:21 2. 解题思路 我们可以通过将给定整数进行取余操作,不断得到末尾数字,再将其添加到反转后的数的末尾。此外,每次取余操作后,将原数除以10可以将最后一位去掉。 对于正数,一…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部