• 反射学习:动态创建对象。


    利用反射动态的创建对象一般可以使用两种方法。

    Assembly的CreateInstance方法。

    AssemblyCreateInstance有三个重载,第一个参数需要是一个字符串表示的完整的类名。第二个参数是一个bool类型,如果为true,表示对第一个参数不区分大小写 

    第三个: 影响执行搜索的方式的位屏蔽。此值是 System.Reflection.BindingFlags 中的位标志的组合。

            //   binder:   一个启用绑定、参数类型强制、成员调用以及通过反射进行 MemberInfo 对象检索的对象。如果 binder 为 null,则使用默认联编程序。

            //   args:   Object 类型的数组,包含要传递给构造函数的参数。此参数数组在数量、顺序和类型方面必须与要调用的构造函数的参数匹配。如果需要默认的构造函数,

    则 args 必须是空数组或 null。

            //   culture:   用于控制类型强制的 CultureInfo 的实例。如果这是 null,则使用当前线程的 CultureInfo。(例如,这对于将表示 1000   的 String 转换为 

    Double 值是必需的,因为不同的区域性以不同的方式表示 1000。)

            //   activationAttributes:    包含一个或多个可以参与激活的属性的数组。通常为包含单个 System.Runtime.Remoting.Activation.UrlAttribute 对象的数组。

    System.Runtime.Remoting.Activation.UrlAttribute 指定激活远程对象所需的 URL。有关客户端激活的对象的详细说明,请参见客户端激活。

    Activator类的静态方法CreateInstance。

    CreateInstance的第一个参数说明是程序集的名称,为null时表示当前程序集;第二个参数说明要创建的类型名称。Activator.CreateInstance返回的是一个ObjectHandle对象,必须进行一次Unwrap()才能返回Object类型,进而可以强制转换成我们需要的类型(本例中是MathClass)ObjectHandle包含在System.Runtime.Remoting命名空间中,可见它是Remoting相关的,实际上ObjectHandle类只是一个对原类型进行了一个包装以便进行封送。

    无参构造:

    有参构造:


    动态调用 :

    .使用InvokeMember调用方法

    InvokeMember("方法名"BindingFlags.InvokeMethod, null,对象实例,方法参数);

    静态:InvokeMember("方法名"BindingFlags.InvokeMethod, null,'类型Type',方法参数);

    .MethodInfo.Invoke调用方法 

    MethodInfo mi = t.GetMethod("方法名"", BindingFlags.Instance | BindingFlags.Public);

    mi.Invoke(对象实例, null);

    静态 

       MethodInfo mi1 = t.GetMethod("方法名""BindingFlags.Static | BindingFlags.Public);

    Mi1.Invoke(null, 方法参数 );



    用反射可以达到最大程度上的多态 

  • 相关阅读:
    ReactiveCocoa详解
    你真的了解iOS的深浅拷贝吗?
    Spring Boot中使用Swagger2构建强大的RESTful API文档
    Spring Boot Logback应用日志
    HTTP与私有二进制协议之间的区别
    Linux常见命令
    solr云的简单搭建(了解)
    项目开发与总结
    垂直分库所带来的问题和解决方法
    水平分库分表的关键问题及解决思路
  • 原文地址:https://www.cnblogs.com/roamman/p/1459760.html
Copyright © 2020-2023  润新知