C#——反射详情

反射

反射(Reflection)是指程序可以访问、检测和修改它本身状态或行为的一种能力,反射中提供了用来描述程序集、模块和类型的对象,可以使用反射动态地创建类型的实例,并将类型绑定到现有对象,或者从现有对象中获取类型,然后调用其方法或访问其字段和属性。 如果代码中使用了特性,也可以利用反射来访问它们。

反射的用途

* 在运行时查看视图属性信息;

* 检查装配中的各种类型并实例化这些类型;

* 在后期绑定到方法和属性;

* 在运行时创建新类型,然后使用这些类型执行一些任务。

cs 复制代码
  using System;
    
    class MainClass
    {
        public static void Main(string[] args)
        {
            //1.通过对象获取到这个对象所属类的Type对象
            TestClass c = new TestClass();
            Type t = c.GetType();
    
            //2.通过Type类中的静态方法GetType获取到类的Type对象
            //Type t = Type.GetType("TestClass");
    
            //3.通过typeof关键字获取到类的Type对象
            //Type t = typeof(TestClass);
    
            Console.WriteLine(t.Name);//获取类名(不带命名空间)
            Console.WriteLine(t.FullName);//获取类名(带命名空间)
            Console.WriteLine(t.Assembly);//获取程序集
            Console.WriteLine(t.BaseType);//获取基类类型
    
            Console.WriteLine("----------获取类中字段");
            var fields = t.GetFields();
            foreach (var temp in fields)
            {
                Console.WriteLine(temp.Name);
            }
    
            Console.WriteLine("----------获取类中属性");
            var properties = t.GetProperties();
            foreach (var temp in properties)
            {
                Console.WriteLine(temp.Name);
            }
    
            Console.WriteLine("----------获取类中方法");
            var methods = t.GetMethods();
            foreach (var temp in methods)
            {
                Console.WriteLine(temp.Name);
            }
    
            Console.WriteLine("----------获取类中成员");
            var members = t.GetMembers();
            foreach (var temp in members)
            {
                Console.WriteLine(temp.Name);
            }
    
            Console.WriteLine("----------获取类中嵌套类");
            var nesteds = t.GetNestedTypes();
            foreach (var temp in nesteds)
            {
                Console.WriteLine(temp.Name);
            }
    
            Console.WriteLine("----------获取类中构造函数");
            var constructors = t.GetConstructors();
            foreach (var temp in constructors)
            {
                Console.WriteLine(temp.Name);
            }
    
            //获取所有程序集
            var allAssemblies = AppDomain.CurrentDomain.GetAssemblies()
        }
    }
    
    public class TestClass
    {
        public string str;
        public int num { get; set; }
        public void Fun()
        {
    
        }
        public class TestNestedClass
        {
    
        }
    }
相关推荐
..Dauntless..2 小时前
【Linux】一切皆文件和缓冲区
linux·运维·服务器
裕晟资质规划2 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
QMCY_jason2 小时前
x86 ubuntu2204 无gui 安装 openeuler 2203 aarch64版本
linux·运维·服务器
重生之小比特2 小时前
【Linux系统】12 进程程序替换 自定义Shell 命令行解释器
linux·运维·服务器
轻舟技术A2 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
连山齐名2 小时前
ai应用开发的学习笔记
服务器·笔记·学习
Shadow(⊙o⊙)2 小时前
仿muduo实现高并发服务器——事件就绪管理Channel.hpp
服务器·c++
あ-2 小时前
CubeSandBox配置CubeMaster CPU 超分
linux·运维·服务器
黄俊懿2 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
是真的小外套3 小时前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络