反射的应用笔记

1 篇文章 0 订阅
            Console.WriteLine("Hello World!");
            /*
            1.反射:来自于System.Reflection.是一个帮助类库  可以读取dll/exe中metadata和使用metadata+动态的创建dll/exe
              
            2.
             */
            //反射
            //1.动态读取Dll
            Assembly assembly = Assembly.LoadFrom("");   //dll名称
            //assembly.GetTypes();//获取到类型
            //assembly.GetFiles();//获取程序清单
            //assembly.GetName(); //获取方法
            //1.获取到具体的类型
            Type type = assembly.GetType();
            //2.创建对象
            //1.
            //object? oInstance = Activator.CreateInstance(type);

            //2.
            //如果使用dynamic关键字声明对象,调用的时候没有限制   dynamic:动态类型,运行时决定类型
            //dynamic dInstance = Activator.CreateInstance(type);
            //dInstance.方法();

            //3.类型转换
            //如果类型一致,就可以转换,如果不一致就返回null
            //反射的类 helper = oInstance as 反射的类;

            //4.调用方法
            //helper.方法();

            //2.反射黑科技---反射可以做到普通方式做不到的事情  但是反射破坏单例  如果回去多个对象,但是都是获取多一个实例
            //可以通过反射调用任何访问修饰符的权限

            //5.反射调用方法+反射创建对象的升级篇
            //1.如何访问带参数的构造方法

            //无参的调用
            //Assembly assembly1 = Assembly.LoadFrom("");//dll
            //Type type1 = assembly1.GetType("");//类名引用
            //object noParaObject = Activator.CreateInstance(type);

            //调用有参数的 --- 需要传递一个object类型的数组作为参数,没有匹配的会报异常
            //object.paraObject = Activator.CreateInstance(type,new object[] { 参数});

            //调用方法不一定要类型转换后才使用
            //反射调用方法
            //1.获取方法 得到MethodInfo
            //Assembly assembly1 = Assembly.LoadFrom("");//dll
            //Type type1 = assembly1.GetType("");//类名引用
            //object noParaObject = Activator.CreateInstance(type);
            //MethodInfo show1 = type.GetMethod("show1");  // 调用show方法
            //show1.Invoke(noParaObject,new object[] { }); //没有参数

            //2.执行Invoke的方法,传递方法所在的类的实例对象+参数
            //获取私有的
            //MemberInfo show2 = type.GetMethod("show4", BindingFlags.NonPublic | BindingFlags.Instance);
            //调用静态方法
            //MemberInfo show3 = type.GetMethod("show4");
            //show3.Invoke(null, new objectp[] { "" });

            //调用泛型方法
            //Assembly assembly1 = Assembly.LoadFrom("");//dll
            //Type type1 = assembly1.GetType("");//类名引用
            //object noParaObject = Activator.CreateInstance(type);
            //在调用方法的时候确认泛型的类型
            //MemberInfo show = type.GetMethod(new Type[] { typeof(int),...});//里面的方法
            //show.Invoke(noParaObject,new object[] {123...);

            //调用泛型形参
            //Assembly assembly1 = Assembly.LoadFrom("");//dll
            //Type type1 = assembly1.GetType("");//类名引用  但是要在后面加  ~多少个形参
            //Type type2 = type.MakeGenericType(new Type[] { typeof(int), });
            //object noParaObject = Activator.CreateInstance(type2);

            //6.反射多种应用场景
            //1.反射+配置文件+工厂。
            //2.调用方法 -- 需要类型名称 + 方法名称就可以调用到方法。MVC框架

            //7.反射的局限性  
            //1.性能问题 -- 主要损耗性能的是记载Dll的时候会消耗性能

            //8.反射调用属性 -- 一个类的内部, 
            //属性是不保存数据的,字段才保存数据
            //如何使用属性和字段
            {
                //Type type1 = typeof(类名);
                //object pObject = Activator.CreateInstance(type1);
                //foreach(var prop in type.GetProperties())
                //{
                //    Console.WriteLine(prop.Name);  //打印所有的属性
                //    //逐个属性赋值
                //    if(prop.Name.Equals("ID"){
                //      SetValue是设置属性   GetValue是获取属性
                //     prop.SetValue(pObject,134)
                //    }  
                //}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凡心朴朴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值