C# 反射
1. 获取程序集
Assembly assembly = Assembly.Load("Ruanmou.DB.MySql"); //1 动态加载 一个完整dll名称不需要后缀 从exe所在的路径进行查找 Assembly assembly1 = Assembly.LoadFile(@"D:\ruanmou\online12\20181212Advanced12Course2Reflection\MyReflection\MyReflection\bin\Debug\Ruanmou.DB.MySql.dll");//完整路径 Assembly assembly2 = Assembly.LoadFrom("Ruanmou.DB.MySql.dll");//当前路径 Assembly assembly3 = Assembly.LoadFrom(@"D:\ruanmou\online12\20181212Advanced12Course2Reflection\MyReflection\MyReflection\bin\Debug\Ruanmou.DB.MySql.dll");//当前路径
2. 获取类型,创建对象,调用方法
Console.WriteLine("************************Reflection************************"); Assembly assembly = Assembly.Load("Ruanmou.DB.MySql");//1 动态加载 Type type = assembly.GetType("Ruanmou.DB.MySql.MySqlHelper");//2 获取类型 完整类型名称 object oDBHelper = Activator.CreateInstance(type);//3 创建对象 IDBHelper iDBHelper = oDBHelper as IDBHelper;//4 类型转换 不报错,类型不对就返回null iDBHelper.Query();//5 方法调用
3. 获取不同的构造函数, 根据不同的构造函数创建不同的实例对象
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest"); foreach (ConstructorInfo ctor in type.GetConstructors()) { Console.WriteLine(ctor.Name); foreach (var parameter in ctor.GetParameters()) { Console.WriteLine(parameter.ParameterType); } } object oTest1 = Activator.CreateInstance(type); object oTest2 = Activator.CreateInstance(type, new object[] { 123 }); object oTest3 = Activator.CreateInstance(type, new object[] { "陌殇" });
4. 反射,创建单例的实例对象
//反射破坏单例---就是反射调用私有构造函数 Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.Singleton"); Singleton singletonA = (Singleton)Activator.CreateInstance(type, true); Singleton singletonB = (Singleton)Activator.CreateInstance(type, true); Singleton singletonC = (Singleton)Activator.CreateInstance(type, true); Singleton singletonD = (Singleton)Activator.CreateInstance(type, true); Console.WriteLine($"{object.ReferenceEquals(singletonA, singletonD)}");
5, 反射,创建泛型类实例对象
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.GenericClass`3"); //GenericClass<string, int, DateTime> genicClass = new GenericClass<string, int, DateTime>(); //object oGeneric = Activator.CreateInstance(type); Type typeMake = type.MakeGenericType(new Type[] { typeof(string), typeof(int), typeof(DateTime) }); object oGeneric = Activator.CreateInstance(typeMake);
6. 反射,调用重载方法
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest"); object oTest = Activator.CreateInstance(type); foreach (var method in type.GetMethods()) { Console.WriteLine(method.Name); foreach (var parameter in method.GetParameters()) { Console.WriteLine($"{parameter.Name} {parameter.ParameterType}"); } } { MethodInfo method = type.GetMethod("Show1"); //if() method.Invoke(oTest, null); } { MethodInfo method = type.GetMethod("Show2"); method.Invoke(oTest, new object[] { 123 }); } { MethodInfo method = type.GetMethod("Show3", new Type[] { }); method.Invoke(oTest, null); } { MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int) }); method.Invoke(oTest, new object[] { 123 }); } { MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string) }); method.Invoke(oTest, new object[] { "一生为你" }); } { MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int), typeof(string) }); method.Invoke(oTest, new object[] { 234, "心欲无痕" }); } { MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string), typeof(int) }); method.Invoke(oTest, new object[] { "PHS", 345 }); } { MethodInfo method = type.GetMethod("Show5"); method.Invoke(oTest, new object[] { "张中魁" });//静态方法实例可以要 } { MethodInfo method = type.GetMethod("Show5"); method.Invoke(null, new object[] { "张中魁" });//静态方法实例也可以不要 }
7. 反射,调用私有方法
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest"); object oTest = Activator.CreateInstance(type); var method = type.GetMethod("Show4", BindingFlags.Instance | BindingFlags.NonPublic); method.Invoke(oTest, new object[] { "我是老王" });
8. 反射,调用泛型方法
Console.WriteLine("********************GenericMethod********************"); Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.GenericMethod"); object oGeneric = Activator.CreateInstance(type); //foreach (var item in type.GetMethods()) //{ // Console.WriteLine(item.Name); //} MethodInfo method = type.GetMethod("Show"); var methodNew = method.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) }); object oReturn = methodNew.Invoke(oGeneric, new object[] { 123, "董小姐", DateTime.Now });
9. 反射,调用泛型类的泛型方法
Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer"); Type type = assembly.GetType("Ruanmou.DB.SqlServer.GenericDouble`1").MakeGenericType(typeof(int)); object oObject = Activator.CreateInstance(type); MethodInfo method = type.GetMethod("Show").MakeGenericMethod(typeof(string), typeof(DateTime)); method.Invoke(oObject, new object[] { 345, "感谢有梦", DateTime.Now });
10. 反射,ORM
Type type = typeof (People); 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)}" ); } 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)}" ); } |
11, 反射,DTO
Type typePeople = typeof(People); Type typePeopleDTO = typeof(PeopleDTO); object peopleDTO = Activator.CreateInstance(typePeopleDTO); foreach (var prop in typePeopleDTO.GetProperties()) { //if (prop.Name.Equals("Id")) //{ // //object value = typePeople.GetProperty("Id").GetValue(people); // object value = typePeople.GetProperty(prop.Name).GetValue(people); // prop.SetValue(peopleDTO, value); //} //else if (prop.Name.Equals("Name")) //{ // //object value = typePeople.GetProperty("Name").GetValue(people); // object value = typePeople.GetProperty(prop.Name).GetValue(people); // prop.SetValue(peopleDTO, value); //} object value = typePeople.GetProperty(prop.Name).GetValue(people); prop.SetValue(peopleDTO, value); } foreach (var filed in typePeopleDTO.GetFields()) { object value = typePeople.GetField(filed.Name).GetValue(people); filed.SetValue(peopleDTO, value); }
知识介绍:https://blog.csdn.net/sinolover/article/details/104159239
付费内容,请联系本人QQ:1002453261
本文来自博客园,作者:明志德道,转载请注明原文链接:https://www.cnblogs.com/for-easy-fast/p/12312069.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析