当前位置: 代码网 > it编程>编程语言>C# > C#反射

C#反射

2024年05月18日 C# 我要评论
目录C#反射概述语法应用场景总结引用 C#反射 概述 C# 反射(Reflection)是一种强大的机制,它允许程序在运行时访问和操作 .NET 程序集中的类型和成员。 获取程序集、模块 和类型成员信息,三者关系介绍请查看。 语法 反射的核心概念是 Type 对象。Type 对象表示一个 .NET ...

c#反射

概述

c# 反射(reflection)是一种强大的机制,它允许程序在运行时访问和操作 .net 程序集中的类型和成员。
获取程序集、模块 和类型成员信息三者关系介绍请查看

语法

反射的核心概念是 type 对象。type 对象表示一个 .net 类型,并提供用于访问该类型及其成员的方法和属性。
以下是一些常用的 type 对象方法:

  • getfields():获取类型的字段
  • getproperties():获取类型的属性
  • getmethods():获取类型的的方法
  • getconstructors():获取类型的构造函数
  • createinstance():创建类型的实例
      /// <summary>
      /// 获取程序集信息
      /// </summary>
      public static void getassemblyinfo() 
      {
          // 获取当前程序集
          assembly assembly = assembly.getexecutingassembly();
         //获取dll程序集
          assembly assembly2 = assembly.loadfrom("note.basic.dll");
          //获取程序集下的类型信息
         var typesinfo= assembly.definedtypes;

          //获取程序集下的模块信息
          var modules = assembly.getloadedmodules();//.getmodules();
          foreach (var module in modules) 
          {
              //获取模块下的类型信息, 不是com和嵌套类型
             var types= module.gettypes().where(p=>p.namespace.startswith("note")&&
              p.iscomobject==false&&!p.isnested
             );
          }
      }
        /// <summary>
        /// 获取类型信息
        /// </summary>
        public static void gettypeinfo() 
        {
            // 获取 person 类型的 type 对象
            type persontype = type.gettype("note.basic.person");

            // 获取 person 类型的名称
            string typename = persontype.fullname;
            console.writeline("type name: {0}", typename);

            // 获取 person 类型的字段
            fieldinfo[] fields = persontype.getfields();
            foreach (fieldinfo field in fields)
            {
                messagebox.show(string.format("field: {0} ({1})", field.name, field.fieldtype.name));
            }

            // 获取 person 类型的属性
            propertyinfo[] properties = persontype.getproperties();
            foreach (propertyinfo property in properties)
            {
                messagebox.show(string.format("property: {0} ({1})", property.name, property.propertytype.name));
            }

            // 获取 person 类型的构造函数
            constructorinfo[] constructors = persontype.getconstructors();
            foreach (constructorinfo constructor in constructors)
            {
                parameterinfo[] parameters = constructor.getparameters();
                messagebox.show(string.format("constructor: {0}({1})", constructor.name, string.join(", ", parameters.select(p => p.parametertype.name))));
            }

            // 获取 person 类型的 sayhello 方法
            methodinfo sayhellomethod = persontype.getmethod("print");
            messagebox.show(string.format("method: {0}({1})", sayhellomethod.name, string.join(", ", sayhellomethod.getparameters().select(p => p.parametertype.name))));

            // 创建 person 类型的实例
            object? personobject = persontype.assembly.createinstance("note.basic.person");

            // 将 object 对象转换为 person 对象
            person person = (person)personobject;

            // 设置 person 对象的属性
            person.name = "john doe";
            person.age = 30;

            // 调用 person 对象的方法
            sayhellomethod.invoke(person, null);
        }

应用场景

  1. 动态加载类和创建对象: 反射可用于在运行时加载类,而无需显式地引用它们。这对于创建插件和扩展等需要在运行时动态加载代码的应用程序非常有用。

  2. 获取类型和对象的信息: 反射可用于获取有关类型和对象的大量信息,包括类型名称、属性、方法、构造函数等。这对于需要根据类型或对象的信息执行操作的应用程序非常有用。

  3. 调用方法: 反射可用于调用对象的任何方法,包括私有方法。这对于需要在无法直接访问方法的情况下调用方法的应用程序非常有用。

  4. 创建代理对象: 反射可用于创建代理对象,代理对象可以拦截和修改对目标对象的调用。这对于实现日志记录、安全性和其他方面的功能非常有用。

  5. 反序列化 json 和 xml 等数据格式: 反射可用于反序列化 json 和 xml 等数据格式,将数据转换为对象。这对于需要将数据从字符串转换为对象格式的应用程序非常有用。

  6. 生成代码: 反射可用于生成代码,例如代码生成器和序列化工具可以使用反射来根据类型信息生成代码。

总结

反射是一种功能强大的技术,可用于许多不同的应用程序。它可以使您的代码更加灵活、可扩展和可维护。但是,反射也有一些缺点,例如它可能会降低性能并增加安全性风险。因此,在使用反射之前,请务必权衡利弊。

引用

  1. 博文示例代码 https://github.com/chi8708/dotnetnote/blob/master/note.basic/10generic
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com