c#(Reflection)反射

目录

一、什么是反射

二、反射的使用

三、如何加载程序集?

四、Assembly对象的使用

1,获取程序集的全名

2,遍历程序集中定义的类型

五、反射优缺点


一、什么是反射

什么是元数据,什么是反射

文本和特新都是数据,变量类这些都是数据

路径:项目文件夹下bin\Debug\netcoreapp3.1

我们写的代码,编译成程序集,windows主要有两种程序集,第一种是dll,第二种是exe

生成为dll可以拿给别的开发者来使用,在游戏中经常会出现,提示缺少了dll,就是缺少了程序集

 反射

反射是指可以访问、检测和修改它本身状态或行为的一种能力。我们可以使用反射动态地创建类型实例,将类型绑定到现有对象,或从现有对象中获取类型。然后可以调用类型方法或访问其字段属和属性。


二、反射的使用

反射的命名空间System.Reflection

编译后的代码,也就是我们的元数据,他们保存在程序集中。

那么我们可以通过反射来查看其他程序集和本身的元数据,这个行为被称为反射。

下面使用type类来进行反射数据

创建一个class1的类

    class Class1
    {
        //字段
        private int a;
        public int b;
        public string c;
        //属性
        public int D
        {
            get;set;
        }
        public int E
        {
            get; set;
        }
        ///方法
        public int getA()
        {
            return a;
        }
    }

 在main函数中使用反射来获取数据信息

        static void Main(string[] args)
        {
            //Type
            Type t = typeof(Class1);
            Console.WriteLine(t.Name);//类名
            Console.WriteLine(t.Namespace);//命名空间
            Console.WriteLine(t.Assembly);//程序集的属性

            //通过GetFields()获取字段,返回的是FieldInfo[]的数组,他吧每个字段都封装成了多个FieldInfo
            FieldInfo[] fis=t.GetFields();
            Console.WriteLine("a字段是私密的,所以没获取到");
            foreach (FieldInfo fi in fis)
            {
                Console.WriteLine(fi.Name);//类名
            }
            //获取所有属性
            Console.WriteLine("获取所有属性");
            PropertyInfo[] pfs=t.GetProperties();
            foreach (PropertyInfo pf in pfs)
            {
                Console.WriteLine(pf.Name);//类名
            }
            //获取所有方法名
            Console.WriteLine("获取所有方法名");
            MethodInfo[] mis = t.GetMethods();
            foreach (MethodInfo mi in mis)
            {
                Console.WriteLine(mi.Name);//类名
            }
        }

 GetMethods()会获取到他父类的方法名,运行结果

另外一种获取type对象

            Class1 c = new Class1();
            Type t = c.GetType();
            //Type
            //Type t = typeof(Class1);

他们是一样的,通过类方法获取
 


三、如何加载程序集?

1,Assembly assembly1 =Assembly.Load("SomeAssembly");

根据程序集的名字加载程序集,它会在本地目录和全局程序集缓存目录查找符合名字的程序集。


2,Assembly assembly2 =Assembly.LoadFrom(@"c:\xx\xx\xx\SomeAssembly.dll")//这里的参数是程序集的完整路径名,它不会在其他位置搜索。


四、Assembly对象的使用


1,获取程序集的全名

string name = assembly1.Ful lName;

2,遍历程序集中定义的类型

Type[] types =theAssembly.GetTypes();
foreach(Type definedType in types) (
//
)

五、反射优缺点

优点:

  1. 提高程序的灵活性和扩展性
  2. 降低耦合性,提高自适应能力
  3. 允许程序创建和控制任何类的对象,无需提前编码目标类。

缺点:

  1. 性能问题:反射是一种解释操作,用于字段和方法接入时要慢于直接代码。所以反射机制主要用于在对灵活性和扩展性要求很高的系统上。普通程序不建议使用
  2. 使用反射会模糊程序内部逻辑,程序员需要在源代码中看到逻辑,反射却绕过源代码的技术。维护不好,反射比直接代码更复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aizhaiyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值