反射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;
        }
原文地址:https://www.cnblogs.com/JohnTang/p/10919778.html