C#使用Dynamic实现简化反射

 更新时间:2023年07月24日 15:05:55   作者:可均可可  
这篇文章主要为大家详细介绍了C#如何使用Dynamic来实现简化反射,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下

最近有时间看点书了,把157个建议在重新看一遍,代码都调试一遍。当我看到第15个建议的时候有些出入,就记录下来,欢迎大家来探讨。

第十五条建议是,使用dynamic简化反射的使用,如果是针对这句话来讲,没问题,是正确的。dynamic的确可以简化反射的使用,但是从性能上来说是有条件的,可以根据自己情况选择。

我按着书上的代码,原封不动的敲了一遍,如下:

class Program
    {
        static void Main(string[] args)
        {
            int times = 1;
            DynamicSample dynamicSample = new DynamicSample();
            var addMethod = typeof(DynamicSample).GetMethod("Add");
            Stopwatch watch1 = Stopwatch.StartNew();
            int result = 0;
            for (int i = 0; i < times; i++)
            {
                result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
            }
            Console.WriteLine(string.Format("正常的反射耗时:{0}毫秒", watch1.ElapsedMilliseconds));
            Console.WriteLine("正常反射的结果:"+result);
            dynamic dynamicSample2 = new DynamicSample();
            int result2 = 0;
            Stopwatch watch2 = Stopwatch.StartNew();
            for (int i = 0; i < times; i++)
            {
                result2 = dynamicSample2.Add(1, 2);
            }
            Console.WriteLine(string.Format("Dynamic的反射耗时:{0}毫秒", watch2.ElapsedMilliseconds));
            Console.WriteLine("Dynamic反射的结果:"+result2);
            DynamicSample reflectSamplebetter = new DynamicSample();
            var addMethod2 = typeof(DynamicSample).GetMethod("Add");
            var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2);
            int result3 = 0;
            Stopwatch watch3 = Stopwatch.StartNew();
            for (int i = 0; i < times; i++)
            {
                result3=delg(reflectSamplebetter,1,2);
            }
            Console.WriteLine(string.Format("优化的反射耗时:{0}毫秒", watch3.ElapsedMilliseconds));
            Console.WriteLine("优化的反射结果:"+result3);
            Console.Read();
        }
    }

对了,还有我们的测试实体类:

public class DynamicSample
    {
        public string Name { get; set; }
        public int Add(int a, int b)
        {
            return a + b;
        }
    }

我们都知道反射是有损性能的,无论是使用正常反射还是dynamic都是不好的,尽量不要使用,这是我的建议。

如果非要用反射,就性能来讲,三者之间也是有选择的,不是说dynamic就是好的,如果就简化反射来说是好的,但是性能并不是那么好。

我先测试一下:一次循环的结果如下

很明显,正常的反射和优化后的反射要好,dynamic就差点了,在测试10000次循环:

在一万次循环的情况下,优化后的反射依然那么给力,正常反射的性能也不错,dynamic就差很多了。

我们再看看十万次循环怎么样?这次测试三次,看看每次的结果。

100000次第一次测试结果:

100000次第二次测试:

100000次第三次测试:

十万次测试,总体上来看,性能最好的还是优化后的反射,正常的反射要好一点,dynamic是最差的。

最后测试一百万次循环,第一次测试结果:

百万第二次,看看结果:

总体上来看,百万循环,dynamic的好处才看到,性能也不错,又简化反射的使用,性能最好还是优化后翻身,大家明白了吧,不是任何时候dyanmic都是有用的。

好了,就记录这么多吧,可能测试的不全面,希望大家包涵。

选择条件是,反射能不用就不用,如果注重性能,优化后的反射使用方法是最好的,如果不是很复杂,用正常反射就可以,除非循环真的要那么多次,但是dynamic是真的可以简化反射使用,对性能是分条件的。

到此这篇关于C#使用Dynamic实现简化反射的文章就介绍到这了,更多相关C# Dynamic简化反射内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C#中使用Oracle存储过程返回结果集的问题

    关于C#中使用Oracle存储过程返回结果集的问题

    Oracle中可以使用游标(Cursor)对数据集进行操作,但在存储过程输出参数中直接使用Cursor错误,下面小编给大家带来了C#中使用Oracle存储过程返回结果集的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • C#中使用反射获取结构体实例及思路

    C#中使用反射获取结构体实例及思路

    一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用
    2013-10-10
  • C#简单实现防止多个程序运行的方法

    C#简单实现防止多个程序运行的方法

    这篇文章主要介绍了C#简单实现防止多个程序运行的方法,涉及C#进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-02-02
  • C#导入导出EXCEL文件的代码实例

    C#导入导出EXCEL文件的代码实例

    这篇文章主要介绍了C#导入导出EXCEL文件代码实例,代码的流程和方法都很详细,需要的朋友可以参考下
    2014-04-04
  • C#中使用UDP通信的示例

    C#中使用UDP通信的示例

    这篇文章主要介绍了C#中使用UDP通信的示例,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-11-11
  • c# wpf如何使用Blend工具绘制Control样式

    c# wpf如何使用Blend工具绘制Control样式

    这篇文章主要介绍了c# wpf如何使用Blend工具绘制Control样式,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#的TimeSpan案例详解

    C#的TimeSpan案例详解

    这篇文章主要介绍了C#的TimeSpan案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 利用C#如何给PDF文档添加文本与图片页眉

    利用C#如何给PDF文档添加文本与图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码、日期、公司徽标、文档标题、文件名或作者名等等。那么我们如何以编程的方式添加页眉呢?这篇文章主要介绍了利用C#如何给PDF文档添加文本与图片页眉的相关资料,需要的朋友可以参考下
    2017-01-01
  • 新手小白用C# winform 读取Excel表的实现

    新手小白用C# winform 读取Excel表的实现

    这篇文章主要介绍了新手小白用C# winform 读取Excel表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Winform窗体效果实例分析

    Winform窗体效果实例分析

    这篇文章主要介绍了Winform窗体效果,涉及WinForm窗体设计的常见参数设置及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09

最新评论