博客
关于我
C# 反射
阅读量:423 次
发布时间:2019-03-06

本文共 9812 字,大约阅读时间需要 32 分钟。

 

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
genicClass = new GenericClass
(); //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

  

你可能感兴趣的文章
MangoDB4.0版本的安装与配置
查看>>
Manjaro 24.1 “Xahea” 发布!具有 KDE Plasma 6.1.5、GNOME 46 和最新的内核增强功能
查看>>
mapping文件目录生成修改
查看>>
MapReduce程序依赖的jar包
查看>>
mariadb multi-source replication(mariadb多主复制)
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
ms sql server 2008 sp2更新异常
查看>>