.NET 反射的介绍和简单应用

news/2024/5/19 5:20:38 标签: 开发语言, .net, c#, 反射

什么是反射

反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类似于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。

听起来可能不太清楚,那反射有什么用呢?

  • 在程序运行时,动态加载需要的程序集,以便操作其元数据。(例如有些IOC容器的实现,就是通过配置对应程序集,在运行时动态加载这些程序集,实现注入)
  • 构造出可重用性的代码,通过反射可以动态的绑定/获取数据(例如orm中将查询结果转成实体,在更新数据时需要获取实体信息构造更新语句)

可能还是不太清楚,那下面就通过一个简单的例子来介绍一下:

自定义一个类和特性:

    [AttributeUsage(AttributeTargets.Method)]
    public class ApiAttribute : Attribute
    {
        
        public string name;

        public ApiAttribute(string _name) 
        {
            name = _name;
        }
    }


    public class lwpoor
    {
        private int password;
        public string name;
        public lwpoor()
        {

        }

        public lwpoor(string name)
        {
            this.name = name;
        }

        [Api("测试 test")]
        public string test(string username)
        {
            return username;
        }


        public string test1(string username)
        {
            return username;
        }
    }

使用反射调用自定义类:

static void Main(string[] args)
{
    Console.WriteLine("Hello, World!");

    var type = typeof(lwpoor);
    //获取所有公共属性
    var pro = type.GetFields();
    foreach (var prop in pro)
    {
        Console.WriteLine($"属性名称:{prop.Name} 类型:{prop.FieldType.Name}");
    }

    //获取类中标注ApiAttribute特性的方法
    var methods = type.GetMethods()
        .Where(p=>p.IsDefined(typeof(ApiAttribute),true)).ToList();

    foreach (var method in methods)
    {
        ApiAttribute? att = method.GetCustomAttribute(typeof(ApiAttribute)) as ApiAttribute;
        Console.WriteLine($"方法名:{method.Name}   说明:{att?.name}");
        //获取方法所有参数
        var parameters = method.GetParameters();
        foreach (var param in parameters)
        {
            Console.WriteLine($"参数名:{param.Name}  参数类型:{param.ParameterType.Name}");
        }
        //创建实例
        var obj = Activator.CreateInstance(type);

        var key = Console.ReadLine();
        //调用方法
        var res = method.Invoke(obj, new object[] { key });
        //获取方法返回类型
        var aa = method.ReturnType.Name;
        Console.WriteLine($"调用方法返回类型:{aa}  返回结果:{res}");
    }

    
}

下面来做个总结:

反射提供封装程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和属性。 反射的典型用法如下所示:

  • 使用 Assembly 来定义和加载程序集,加载程序集清单中列出的模块,以及在此程序集中定位一个类型并创建一个它的实例。

  • 使用 Module 发现信息,如包含模块的程序集和模块中的类。 还可以获取所有全局方法或模块上定义的其它特定的非全局方法。

  • 使用 ConstructorInfo 发现信息,如名称、参数、访问修饰符(如 public 或 private)和构造函数的实现详细信息(如 abstract 或 virtual)。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定构造函数。

  • 使用 MethodInfo 发现信息,如名称、返回类型、参数、访问修饰符(如 public 或 private)和方法的实现详细信息(如 abstract 或 virtual)。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定方法。

  • 使用 FieldInfo 发现信息,如名称、访问修饰符(如 public 或 private)和一个字段的实现详细信息 (如 static);并获取或设置字段值。

  • 使用 EventInfo 发现信息(如名称、事件处理程序的数据类型、自定义特性、声明类型以及事件的反射的类型),并添加或删除事件处理程序。

  • 使用 PropertyInfo 发现信息(如名称、数据类型、声明类型,反射的类型和属性的只读或可写状态),并获取或设置属性值。

  • 使用 ParameterInfo 发现信息,如参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置。

  • 使用 CustomAttributeData 在于应用程序域的仅反射上下文中工作时发现有关自定义特性的信息。 CustomAttributeData 使你能够检查特性,而无需创建它们的实例。 System.Reflection.Emit 命名空间的类提供一种专用形式的反射,使你能够在运行时生成类型。

 


http://www.niftyadmin.cn/n/5318211.html

相关文章

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置 1、IOC框架核心原理是依赖倒置原则 C#设计模式的六大原则 使用这种思想方式,可以让我们无需关心对象的生成方式,只需要告诉容器我需要的对象即可,而告诉容器我需要对象的方式就叫做DI(依赖注入&…

vue 组件 import make sure to provide the “name“ option.

百度了好多结果,都过时了,例如: 模块引入是否加{} 再比如: 对于递归组件,请确保提供“name”选项。 出现该错误情况之一: 错误由未正确引入组件或子组件引起,如element-ui中form表单组件未引…

香港Web3:Web3的新热土

相关推荐点击查看TechubNews 随着区块链技术的快速发展,Web3的概念逐渐在全球范围内受到关注。作为亚洲的金融中心,香港在Web3领域也展现出了极大的热情和潜力。本文将探讨香港在Web3领域的发展现状、机遇与挑战。 一、香港Web3的发展现状 香港在Web3…

【漏洞复现】先锋WEB燃气收费系统文件上传漏洞 1day

漏洞描述 /AjaxService/Upload.aspx 存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作…

【模拟IC学习笔记】 采样保持电路的设计

目录 采样保持工作原理 概念 时域响应-采保信号 采样网络的KT/C噪声 采样电容大小的选取 采样抖动(jitter) jitter对SNR的影响 法一 法二 采样开关的种类 单MOS管 实践:Nmos导通电阻 传输门 栅压自举开关 采样技术 上极板采样 下极板采样 采样保持…

轮询定时器 清除 + vue2.0

需求? Gin Vue Element UI框架中, 我的大屏可视化项目, 大屏页面, 里边写了多个轮询定时器. 离开页面需要清理掉, 要不然切换路由还会在后台运行, 页面是自动缓存状态, 也不存在销毁一说了 所以通过路由router配置中, 页面路由监听中, 进行监听路由变化, 但是也没生效 …

Axios基本使用,为学习后续的Vue服务【发送请求+并发请求+前端拦截器】

目录 1、项目中引入Axios 2、使用Axios发送请求 2.1、例&#xff1a;发送GET请求 2.2、例&#xff1a;发送POST请求 3、axios并发请求 4、拦截器 1、项目中引入Axios <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 注&…

基于elementUI的el-table组件实现按住某一行数据上下滑动选中/选择或取消选中/选择鼠标经过的行

实现代码 <template><div :class"$options.name"><el-tablestyle"user-select: none"ref"table":data"tableData":row-class-name"row_class_name"mousedown.native"mousedownTable"row-click&q…