zoukankan      html  css  js  c++  java
  • C# 反射

    1. 获取程序集

                        Assembly assembly = Assembly.Load("Ruanmou.DB.MySql");
                        //1 动态加载 一个完整dll名称不需要后缀  从exe所在的路径进行查找
                        Assembly assembly1 = Assembly.LoadFile(@"D:
    uanmouonline1220181212Advanced12Course2ReflectionMyReflectionMyReflectioninDebugRuanmou.DB.MySql.dll");//完整路径
                        Assembly assembly2 = Assembly.LoadFrom("Ruanmou.DB.MySql.dll");//当前路径
                        Assembly assembly3 = Assembly.LoadFrom(@"D:
    uanmouonline1220181212Advanced12Course2ReflectionMyReflectionMyReflectioninDebugRuanmou.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

      

  • 相关阅读:
    C++STL——vector
    大数常用计算模板及例题
    在线算法&离线算法
    线段树——hdu1166敌兵布阵
    C++STL——堆栈
    C++STL——优先队列
    C++STL——队列
    图的建立——图的两种存储结构
    Manacher算法——最长回文子串
    HttpClient的几个实现类
  • 原文地址:https://www.cnblogs.com/for-easy-fast/p/12312069.html
Copyright © 2011-2022 走看看