C#中几种反射机制的比较

本文介绍了C#中的反射技术,包括原生反射、委托和快速调用(fast invoke),并从函数调用的角度比较了它们的性能。原生反射通过MethodInfo和Assembly两种方式调用函数,性能较低。委托更特例化,但需要预先定义委托类型。快速调用通过MSIL实现,性能接近直接调用。性能测试显示,FastInvoke与直接调用性能相近,而原生反射和Assembly较慢。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前言

        反射是一项很有趣的技术,她提供了另一个视角来模糊、统一地看待我们用代码搭建起来的小世界。由于之前工作的关系,小鱼酱曾用C++初略地实现过一套反射系统,用来支持游戏中属性编辑器的开发,在C++中反射是一项注入式或者后生成的一种编程方式,会导致代码难以阅读,脱离语言的美感。但在C#中的反射却是自然而优雅。
        因为最近在做手游开发的缘故,开始研究unity3D,开始重拾久违的C#。于是下面小鱼酱将简单介绍一下C#中的反射技术,并通过函数调用的角度来比较一下各个方式的性能。

2. 几种反射机制

2.1. 原生反射

        C#通过System.Reflection程序集提供出了强大完整的反射功能,使我们可以在程序运行期获得“程序集”、“模块”、“类型”等信息,同时她也提供出了一种通用的方式的来访问与使用这些信息。于是我们在代码的世界中,面对不同的“人”或“物”,就有了不卑不亢的同一种腔调。
        在这里我们只讨论函数调用,后面也只以函数调用的角度来比较一下各个反射机制的性能。
        在原生反射的框架下进行函数调用有两种较为常用的“招式”。分别如下:

        1. 通过MethodInfo
            以函数方法对象抽象调用函数,调用效率较低。

    /// <summary>
    /// 原生反射测试
    /// </summary>
    public class NativeReflectTest
    {
        /// <summary>
        /// 运行
        /// </summary>
        public static void Run()
        {
            //类型对象
            Type personType = typeof(Person);
            
            //方法信息
            MethodInfo methodInfo = personType.GetMethod("Say");

            //对象与参数
            Person person = new Person();
            String 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值