翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
dynamic简介
dynamic是.NET Framework4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译时默认dynamic对象支持你想要的任何特性。
dynamic简化反射实现
使用dynamic来简化反射实现是一种比较常见的编程技巧,它可以减少代码的复杂性并提高可读性。下面是一个使用dynamic来简化反射实现的示例:
  1. // 定义一个类
  2. public class Person
  3. {
  4.     public string Name { get; set; }
  5.     public int Age { get; set; }
  6.     public string Gender { get; set; }
  7. }
  8. // 创建一个对象并设定属性值
  9. var person = new Person
  10. {
  11.     Name = "刘备",
  12.     Age = 30,
  13.     Gender = "男"
  14. };
  15. // 使用反射获取属性值
  16. var type = person.GetType();
  17. var properties = type.GetProperties();
  18. foreach (var property in properties)
  19. {
  20.     var value = property.GetValue(person);
  21.     Console.WriteLine($"{property.Name}:{value}");
  22. }
  23. // 使用dynamic来简化反射实现
  24. dynamic dynamicPerson = person;
  25. Console.WriteLine($"Name:{dynamicPerson.Name}, Age:{dynamicPerson.Age}, Gender:{dynamicPerson.Gender}");
  26.  //欢迎公众号:DOTNET开发跳槽,领取海量面试题
复制代码
可以看到,使用dynamic来简化反射实现可以将代码变得更加简洁易读,同时也可以避免一些繁琐的反射操作。使用dynamic可能会带来一些性能上的损失,应该根据具体情况进行选择。具体会不会,下面实验一下。
dynamic与反射的性能对比
这里首先新建一个类和一个两数相加的方法,然后分别使用反射和dynamic来调用这个类的方法,并循环数次,来对比它们的性能。代码如下:
  1.  #region 反射和dynamic的对比
  2. int times = 1000000;
  3. DynamicTest reflectTest = new DynamicTest();
  4. var addMethod = typeof(DynamicTest).GetMethod("Add");
  5. Stopwatch watchl = Stopwatch.StartNew();
  6. for (var i = 0;i< times; i++)
  7. { addMethod.Invoke(reflectTest, new object[] { 1, 2 }); }
  8. Console.WriteLine($"反射耗时:{watchl.ElapsedMilliseconds}毫秒");
  9.   dynamic dynamicTest = new DynamicTest();
  10. Stopwatch watch2 = Stopwatch.StartNew();
  11. for (int i =0;i< times; i++)
  12.       dynamicTest.Add(1,2);
  13.  Console.WriteLine($"dynamic耗时:{watch2.ElapsedMilliseconds} 毫秒");
  14. #endregion
  15.  //测试的类
  16. public class DynamicTest
  17. {
  18.     public string Name{get; set; }
  19.     public int Add(int a, int b)
  20.     {
  21.          return a + b;
  22.     }
  23. }
  24.   //欢迎公众号:DOTNET开发跳槽,领取海量面试题
复制代码
100万次的效果:


1万次的效果:


可见100万次循环的效果dynamic要好点,1万次反射耗时小于dynamic。为了效果,所以每一次实验运行两次。
结语
由上可以看出dynamic的确可以简化反射,让代码更加简洁,可读性更强。但是从对比来看,dynamic在低数量调用的使用上性能要比反射弱太多,比较大的数量调用来说它们不相上下。建议如果你的代码对性能要求不太高的情况下,可以使用dynamic来简化反射。
参考:微软官方文档,《改善C#程序的157个建议》
  1. 来源公众号:DotNet开发跳槽
复制代码
来源:https://www.cnblogs.com/xbhp/archive/2023/04/24/17349082.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具