• 反射


    7、 反射:
    -> 什么是反射
    万物接对象,类描述对象,而类也是对象,描述操作类的这套方法就是反射
    -> 如何反射
    -> 获得类型中所有成员的名字
    Type类是用来描述类型的类
    获得Type:
    对象.GetType();
    typeof(类型名)
    -> 动态的调用dll中的方法

    -> 反射用法
    	-> 使用Assimbly.Load(文件路径)获得Assembly对象
    	-> 使用Assembly对象的GetType方法获得Type
    	-> 使用类型获得Type对象
    	-> 使用Type对象获得成员对象
    	-> 会用Activator.CreateInstance(type)创建对象
    	-> 使用成员对象.Invoke(o, 参数)实现调用
    

    Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
    GetConstructor(参数列表);//这个是找到带参数的构造函数。
    Type类的方法:在编写调用插件的程序时,需要做一系列验证。
    bool IsAssignableFrom(Type c):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受c类型变量的赋值。
    typeof(IPlugin).IsAssignableFrom(t)
    bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
    bool IsSubclassOf(Type c):判断当前类是否是类c的子类。类的事,没有接口的事。
    IsAbstract,判断是否为抽象的,含接口

    MemberInfo类 抽象类,有很多子类,下面讲的类都继承自它,获取程序集成员的相关信息(类型、方法、事件、字段和属性)
    PropertyInfo 获取属性
    主要成员:CanRead、CanWrite、PropertyType属性类型;SetValue、GetValue:读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。pInfo.SetValue(p1, 30, null)
    MethodInfo 获取方法
    MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象。
    FieldInfo 获取字段
    EventInfo 获取事件

    MemberInfo[] ms= type.GetMembers();

            foreach (MemberInfo m in ms)
            {
                if(m.MemberType==MemberTypes.Method)
                {
                    Console.WriteLine(m.Name);
                }
                
            }
    

    // jklib.dll
    Assembly asm = Assembly.LoadFile(Path.GetFullPath("jklib.dll"));

            Type t = asm.GetType("jklib.Class1");
    
            MethodInfo m = t.GetMethod("Func", BindingFlags.NonPublic | BindingFlags.Instance);
    
            object o = Activator.CreateInstance(t);
    
            
            m.Invoke(o, null);
    
    
            Console.ReadKey();
  • 相关阅读:
    墨天轮沙龙 | 宝兰德詹年科 :基础软件中间件,让业务人员更好专注业务逻辑的实现
    Clash for Windows 使用教程(详解,全流程)
    es6 export和export default的区别
    nginx 配置go服务反向代理
    ant design pro git提交error; Angular 团队git提交规范
    windows goland go exec "gcc": executable file not found in %PATH%
    go 地址对齐保证
    node_modules/@umijs/runtime" does not exist in container.
    ant design pro 使用 getFieldValue、setFieldsValue
    antdesignpro 自定义表单 rules规则
  • 原文地址:https://www.cnblogs.com/poli/p/4375915.html
Copyright © 2020-2023  润新知