C#反射

赵融
• 阅读 356

[TOC]

C#反射

概述

C# 反射(Reflection)是一种强大的机制,它允许程序在运行时访问和操作 .NET 程序集中的类型和成员。
<font color="red">获取程序集、模块 和类型成员信息</font>,三者关系介绍请查看

语法

反射的核心概念是 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

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act
Wesley13 Wesley13
3年前
java 反射
一、java的动态性反射机制动态编译动态执行JavaScript代码动态字节码操作二、动态语言动态语言   程序运行时,可以改变程序结构或变量类型,典型的语言:python、ruby、javascript等C,C,JAVA不是动态语言,java可以称之为“准动态性语言”。但java
Wesley13 Wesley13
3年前
java中的反射和代理
  Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制。java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性。这些都是java的基础知识,要想成为一名合格的程序猿,必须掌握!Java反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知
Wesley13 Wesley13
3年前
java面试(反射)05
1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的
Stella981 Stella981
3年前
Cocos Creator 运行时与本地代码双向通讯
cocoscreator游戏在发布到android/ios等平台时,难免要与本地原生平台互相调用。官方为我们提供了Java原生反射机制和ObjectiveC原生反射机制。以android的Java平台为例cocoscreator运行时调用android原生环境varojsb.reflection.cal
Stella981 Stella981
3年前
Golang1.7 Goroutine源码分析(转)
一、       Golang简介1.1概述Golang语言是Google公司开发的新一代编程语言,简称Go语言,Go是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新奇的类型系统允许构建有弹性的模块化程序。Go编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。而他最广为人知的特性便是语言层面
Wesley13 Wesley13
3年前
Java反射练习(二)
这次在运行时使用反射分析对象获取数据域的实际内容packagecom.slliver.reflection;importjava.lang.reflect.Field;/\\\CreatedwithIntelliJIDEA.\User:Administrator\Date:2017/4/130013
Wesley13 Wesley13
3年前
Java反射技术概述
1.什么是Java反射?  就是正在运行,动态获取这个类的所有信息2.反射机制的作用  a.反编译:.class.java  b.通过反射机制,访问Java对象的属性,方法,构造方法等3.反射机制的应用场景  Jdbc加载驱动  SpringIOC实现  Java框架4.创建对象的两种方式  a.直
Wesley13 Wesley13
3年前
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。一、反射反射机制是Java语言提供的一种基础功能,赋予程序在运行时<strong自省</strong(introspect,官方用语)的能力。通过反射我们可以直接
Wesley13 Wesley13
3年前
Java重点基础:反射机制
一、什么是反射?Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。二、反射的三种方式
Wesley13 Wesley13
3年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢