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

这篇具有很好参考价值的文章主要介绍了.NET 反射的介绍和简单应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是反射?

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

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

  • 在程序运行时,动态加载需要的程序集,以便操作其元数据。(例如有些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}");
    }

    
}

.NET 反射的介绍和简单应用,c#,开发语言,.net,c#,反射

下面来做个总结:

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

  • 使用 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 命名空间的类提供一种专用形式的反射,使你能够在运行时生成类型。

 文章来源地址https://www.toymoban.com/news/detail-790548.html

到了这里,关于.NET 反射的介绍和简单应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .net反射(Reflection)

    .NET 反射(Reflection)是指在运行时动态地检查、访问和修改程序集中的类型、成员和对象的能力。通过反射,你可以在运行时获取类型的信息、调用方法、访问字段和属性,以及创建对象实例,而无需在编译时知道这些类型的具体信息。 换句话说,反射可以在类的内部成员不

    2024年04月25日
    浏览(40)
  • Go语言使用net/http实现简单登录验证和文件上传功能

         最近再看Go语言web编程,go语言搭建Web服务器,既可以用go原生的net/http包,也可以用gin/fasthttp/fiber等这些Web框架。本博客使用net/http模块编写了一个简单的登录验证和文件上传的功能,在此做个简单记录。 目录 1.文件目录结构 2.编译运行 3.用户登录  4.文件上传 5.mime/m

    2024年02月11日
    浏览(46)
  • Furion 框架 — 让 .NET 开发更简单,更通用,更流行。

    Furion 官网 非常齐全且兼容性高的的一款轻量级框架 一创建带有 Furion 的项目 以上我创建的三个 api (HelloBlog、 FurionApi) mvc ( FurionMvc ) 以FurionApi 为列 Furion 推荐采用多层项目设计架构,每一个项目层的依赖分别是: 运行结果 第一步 须把Furion 源码文件夹下的 tools/cli.ps1 文件拷贝

    2024年02月04日
    浏览(53)
  • 【.NET Core】反射(Reflection)详解(三)

    反射提供了对已封装的程序集、模型和类型的对象一种动态访问方法。反射包含动态加载程序集的Assembly类、程序集中模块访问的Module类、对类信息Type类、构造函数信息ConstructorInfo类、方法信息MethodInfo类、字段信息FieldInfo类、事件信息EventInfo类、属性信息PropertyInfo类、参数信

    2024年02月03日
    浏览(33)
  • 搞懂.NET应用程序管理员权限:三种简单方法一网打尽

      概述: .NET应用程序以管理员身份运行的方法包括修改清单文件、项目文件,或在运行时动态请求管理员权限。清单文件和项目文件通过声明UAC请求,而动态请求管理员权限则在程序启动时检查并重新启动。选择适当的方法取决于项目需求和配置。 在.NET应用程序中强制以管

    2024年03月19日
    浏览(59)
  • Go语言 -- Web开发基础学习 net/http包

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go语言最擅长的领域就是Web开发,此贴是本人入门完go语法基础后学习Web开发的学习笔记。 新建go文件hello_world.go 写入: 在命令行运行: go run ./hello_world.go 可以发现控制台输出以下信息 通过上述代码

    2024年02月06日
    浏览(52)
  • Net 高级调试之二:CLR和Windows加载器及应用程序域介绍

    一、简介 今天是 Net 高级调试的第二篇文章,第一篇文章记录了自己学习 Net 高级调试的第一步,认识一些调试工具,有了工具的倚仗,我们开始仗剑走天涯了,开始Net 高级调试正式的征程了。我先说一下,我的文章,【调试测试】这部分一般分为两个部分,第一部分是要用

    2024年02月08日
    浏览(44)
  • VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略

    VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略 目录 ADO.net基本名称空间与类 1、ADO.net六个基础名称空间 2、ADO.net类

    2024年02月06日
    浏览(47)
  • .Net开发的音频分离桌面应用,可用于提取背景音乐

    背景音乐对于视频来说是非常重要的,制作视频的人来说,听到一些符合自己视频的背景音乐,又找不到背景音乐的源音乐,这时候就需要有软件帮助提取背景音乐了。 这是基于C#开发的UI界面,支持中文等多国语言、支持分离人声背景音乐的桌面软件,可用于提取背景音乐

    2024年02月03日
    浏览(42)
  • Redis详解:.NET Core开发者的面试与应用指南

    本指南为.NET Core开发者提供了Redis的全面解析,包括其作为内存数据库的优势、数据类型、持久化策略、高可用性架构等。同时,介绍了如何使用StackExchange.Redis、FreeRedis和NewLife.Redis等.NET客户端库进行Redis操作,并提供了面试中可能遇到的Redis相关问题的解答,是.NET Core开发者和求职者的宝贵资源。

    2024年04月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包