泛型类反射调用
泛型类编译后的名字
泛型类通过编译后是会有占位符 `的,有几个参数就是几个`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.字段属性操作(get、set) 首先需要理解一般情况下的如下两步操作,实际上只是为了替换类,如果是操作一个实体类的字段属性 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; }