这篇“C#怎么使用dynamic一行代码实现反射操作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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}"); //关注公众号:Java技术迷,领取java相关书籍
可以看到,使用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 watch3 = Stopwatch.StartNew(); for (int i =0;i< times; i++) dynamicTest.Add(1,2); Console.WriteLine($"dynamic耗时:{watch3.ElapsedMilliseconds} 毫秒"); #endregion //测试的类 public class DynamicTest { public string Name{get; set; } public int Add(int a, int b) { return a + b; } } //关注公众号:Java技术迷,领取java相关书籍
100万次的效果:
1万次的效果:
可见100万次循环的效果dynamic要好点,1万次反射耗时小于dynamic。为了效果,所以每一次实验运行两次。