• 反射2


    泛型类反射调用

    泛型类编译后的名字

          泛型类通过编译后是会有占位符 `的,有几个参数就是几个`x  //x表示个数

    例如: Type tyep=assembly.GetType("Reflection.DB.MySql.GenericClass`3");//此处如果想检验,可以用反编译工具查看源码

    创建实例(泛型类)以及调用方法

    //此处不能直接创建实例,因为泛型是任意类型,而此处需要给出具体类型

        Type typeMake = type.MakeGenericType(new Type[] { typeof(string), typeof(int), typeof(DateTime) });

       object oGeneric = Activator.CreateInstance(typeMake);//typeMake这个才能创建实例

    此时不能直接调用方法,因为编辑器不认可,可以用如下方式

    dynamic dDBHelper= Activator.CreateInstance(oGeneric );

    dDBHelper.方法名();

    泛型方法反射调用

    3.方法反射调用
    1.普通方法调用
         反射创建对象之后,知道方法名称,不做类型转换,如何直接调用方法
          //记载程序集
    Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
    //获取类型(完整的类名)
     Type type =assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest");
    //创建类型对象
     object oTest = Activator.CreateInstance(type);
    //指定方法名称
           MethodInfo method = type.GetMethod("Show1");
           //调用方法,如果没有参数Invoke里传null,否则按调用方法的顺序、个数、类型传递参数
           //oTest表示所在实例
          //不带参数的
    method.Invoke(oTest, null);
    //带参数的
     method.Invoke(oTest, new object[] { 123 });
    //如果有多方法(发生了重载),则需要通过指定类型去找方法,需要和所想找到的方法参数列表完全一致,多个用typeof(类型),分开
     MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int) });
     method.Invoke(oTest, new object[] { 123 });
    
    2.静态方法调用
    method.Invoke(oTest, new object[] { "" });//静态方法实例可以要
    method.Invoke(null, new object[] { "" });//静态方法实例也可以不要
    
    3.私有方法调用
    Var method=type.GetMethod("Show4",BindingFlags.Instance| BindingFlags.NonPublic);
    
    4.初谈MVC原理
    http://localhost:9099/home/index  经过路由解析---会调用--HomeController--Index方法  
    MVC在启动时会先加载--扫描全部的dll--找到全部的Controller--存起来--请求来的时候,用Controller来匹配的---dll+类型名称
    AOP--反射调用方法,可以在前后插入逻辑
    
    5.字段属性操作(getset)
       首先需要理解一般情况下的如下两步操作,实际上只是为了替换类,如果是操作一个实体类的字段属性 
    1.属性赋值
    //Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
    //Type type = assembly.GetType("Ruanmou.DB.SqlServer.GenericMethod");
    Type  type=typeof(实体类);
    Object oPeople=Activator.CreateInstance(type);
    foreach (var prop in type.GetProperties())
    {
        Console.WriteLine($"{type.Name}.{prop.Name}={prop.GetValue(oPeople)}");
        if (prop.Name.Equals("Id"))
        {
            prop.SetValue(oPeople, 234);
        }
        else if (prop.Name.Equals("Name"))
        {
            prop.SetValue(oPeople, "饿了么");
        }
        Console.WriteLine($"{type.Name}.{prop.Name}={prop.GetValue(oPeople)}");
    }
    
    2.字段赋值
      foreach (var field in type.GetFields())
      {
         Console.WriteLine($"{type.Name}.{field.Name}={field.GetValue(oPeople)}");
         if (field.Name.Equals("Description"))
         {
             field.SetValue(oPeople, "并不是外卖,也不是真的饿了");
         }
         Console.WriteLine($"{type.Name}.{field.Name}={field.GetValue(oPeople)}");
     }
    
    6.反射简单的ADO.NET
            public T Find<T>(int id)
            {
               
                Type type = typeof(T);
                string sql = $"SELECT {string.Join(",", type.GetProperties().Select(p => $"[{p.Name}]"))} FROM [{type.Name}] WHERE ID={id}";
                object oObject = Activator.CreateInstance(type);
                using (SqlConnection conn = new SqlConnection(ConnectionStringCustomers))
                {
                    SqlCommand command = new SqlCommand(sql, conn);
                    conn.Open();
                    var reader = command.ExecuteReader();
                    if (reader.Read())
                    {
                        foreach (var prop in type.GetProperties())
                        {
                            prop.SetValue(oObject, reader[prop.Name]);
                        }
                    }
                }
                return (T)oObject;
            }
  • 相关阅读:
    删除表空间 数据库备份 创建用户
    javax.persistence包
    JNDI
    J2EE中关于session 的生命周期
    多表关联
    归档程序错误。在释放之前仅限于内部连接
    spring集成jpa
    Tree.Panel各项属性
    eclipse调试以及step into step over step return区别
    wininet.dll函数库:不会过期的cookie
  • 原文地址:https://www.cnblogs.com/JohnTang/p/10919778.html
Copyright © 2020-2023  润新知