• C#通过反射获取动态访问机制


    动态加载,最基本用到的就是反射机制。在System.Reflection的namespace下有一系列的关于获取Assembly信息、类(型)信息的类、接口、结构等。可能上面的话对急切想实现动态加载控件的朋友来说可能一点用也没有,那么就看下面的代码吧,也许可以使你马上实现你想要的:

                        //加载控件
                        Assembly   assembly   =   Assembly.LoadFrom(@ "C:\Controls.dll ");
                          //获得类(型)
                          Type   type   =   assembly.GetType( "Controls.UserControl ",false,true);
                          //设置筛选标志
                          BindingFlags   bflags   =   BindingFlags.DeclaredOnly   |   BindingFlags.Public  
                                                                                                                  |   BindingFlags.NonPublic   |   BindingFlags.Instance;
                          //调用构造函数并获得对象
                          Object   obj   =   type.InvokeMember( "UserControl ",   bflags   |   BindingFlags.CreateInstance,   null,   null,   null);
                          //将对象转换类型
                          System.Windows.Forms.Control   c   =   (Control)obj;
                          //将控件添加到窗体
                          this.Controls.Add(c);


    下面对上面程序段用到的一些变量、方法做一点说明
    1、BindingFlags,枚举类型
          BindingFlags.Instance                                         :   对象实例
          BindingFlags.Static                                                   :   静态成员  
          BindingFlags.Public                                                 :   指可在搜索中包含公共成员
          BindingFlags.NonPublic                                 :   指可在搜索中包含非公共成员(即私有成员和受保护的成员)
          BindingFlags.FlattenHierarchy           :   指可包含层次结构上的静态成员
          BindingFlags.IgnoreCase                             :   表示忽略   name   的大小写
          BindingFlags.DeclaredOnly                     :   仅搜索   Type   上声明的成员,而不搜索被简单继承的成员
          BindingFlags.CreateInstance               :   表示调用构造函数。忽略   name。对其他调用标志无效

    2、Type.InvokeMember
    public   object   InvokeMember(
          string   name,
          BindingFlags   invokeAttr,
          Binder   binder,
          object   target,
          object[]   args
    );
    参数
                name  
                    String,它包含要调用的构造函数、方法、属性或字段成员的名称。  
                    -   或   -  
                    空字符串   ( " "),表示调用默认成员。  
            invokeAttr  
                          一个位屏蔽,由一个或多个指定搜索执行方式的   BindingFlags   组成。     访问可以是   BindingFlags   之一,如Public、   NonPublic、Private、     InvokeMethod   和   GetField   等。不需要指定查找类型。如果省略查找类型,     则将应用   BindingFlags.Public   |   BindingFlags.Instance。
                binder
                      一个   Binder   对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、   强制参数类型和通过反射调用成   员。       -   或   -       若为空引用(Visual   Basic   中为   Nothing),则使用   DefaultBinder。  
              target  
                      要在其上调用指定成员的   Object。  
            args  
                      包含传递给要调用的成员的参数的数组。  
          返回值
                      表示被调用成员的返回值的   Object。
  • 相关阅读:
    android studio 各种问题
    关于Android开发中Arm、X86和Mips(草稿)
    每日更新
    Error creating bean with name 'userRepository': Invocation of init method failed;
    API 'variant.getJavaCompiler()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'
    increase the minSdkVersion to 26
    Exception thrown on Scheduler.Worker thread. Add `onError` handling
    M600 Pro 安装问题解决
    Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed.
    大疆无人机M100相关问题解决过程
  • 原文地址:https://www.cnblogs.com/zhangxb/p/2460728.html
Copyright © 2020-2023  润新知