• c# 反射调用


    c# 反射调用

    反射加载DLL

                    Assembly assembly = Assembly.Load("Ant.DB.SQLServer");//加载方式一:dll文件名(当前目录)
                    Assembly assembly1 = Assembly.LoadFile(@"E:\MyReflection\MyReflection\Ant.DB.SQLServer\bin\Debug\Ant.DB.Interface.dll");//加载方式二:完整路径(文件具体路径)
                    Assembly assembly2 = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//方法三:完全限定名(当前目录)
                    Assembly assembly3 = Assembly.LoadFrom(@"E:\MyReflection\MyReflection\Ant.DB.SQLServer\bin\Debug\Ant.DB.Interface.dll");//(文件具体路径)
                    Console.WriteLine(assembly);
                    Console.WriteLine(assembly1);
                    Console.WriteLine(assembly2);
                    Console.WriteLine(assembly3);
    
    
       foreach (var type in assembly.GetTypes())//找到所有类型
                    {
                        Console.WriteLine(type.Name);
                        foreach (var item in type.GetMethods())
                        {
                            Console.WriteLine("method.name= "+ item);
                        }
                    }
    

    反射创建对象

     Assembly assembly = Assembly.Load("Ant.DB.SQLServer");//加载方式一:dll文件名(当前目录)
                    Type SQLServer_type = assembly.GetType("Ant.DB.SQLServer.SQLServerHelper");
                   
                    object obj = Activator.CreateInstance(SQLServer_type);
                    SQLServerHelper ServerHelper= obj as SQLServerHelper;
                    Students students = ServerHelper.Find(1);
                    Console.WriteLine(students);
    
    
    
                    Console.WriteLine("----------------------------------------Common--------------------------------");
    

    使用反射创建对象(带参数的构造函数)

       Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");
                    ConstructorInfo[] constructorInfos = type.GetConstructors();
                    foreach (var constructor in constructorInfos)
                    {
                        Console.WriteLine(constructor);//显示类型
                    }
    
                    Console.WriteLine("************************创建对象************************");
                   object oCotr1 = Activator.CreateInstance(type);//无参数构造函数
                   object oCotr2 = Activator.CreateInstance(type,new object[] { "111"});
                   object oCotr3 = Activator.CreateInstance(type, new object[] { 123});
                   object oCotr4 = Activator.CreateInstance(type, new object[] { 123,"123" });
                    #region Common
                    Console.WriteLine("----------------------------------------Common--------------------------------");
    

    使用反射创建对象(私有构造函数)

    Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//加载DLL文件
    Type type = assembly.GetType("Ant.DB.SQLServer.PrivateCtor");//获取到类型
    object oPrivate = Activator.CreateInstance(type, true);
    

    使用反射创建泛型类

      Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.GenericClass`3");//获取到类型名称 
                    Type makeType = type.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(double) });
                    object oGeneric = Activator.CreateInstance(makeType);
    

    通过反射调用方法

    方法无参数

    Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                    object oReflection = 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 methodInfo = type.GetMethod("Test1");
                        methodInfo.Invoke(oReflection, null);//调用方法
                    }
    

    方法携带参数

     Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                    object oReflection = 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 methodInfo = type.GetMethod("Test2");
                     methodInfo.Invoke(oReflection, new object[] {123456 });//调用方法,携带参数
                    }
    

    有参数重载方法

       Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                    object oReflection = 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 methodInfo = type.GetMethod("Test3", new Type[] { typeof(int), typeof(string) });
                        methodInfo.Invoke(oReflection, new object[] { 133, "123" });//调用方法
                    }
    

    无参数重载方法

     Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                    object oReflection = 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 methodInfo = type.GetMethod("Test3", new Type[] { });
                          methodInfo.Invoke(oReflection, null);//调用方法
                    }
    

    静态方法调用

    MethodInfo methodInfo = type.GetMethod("Test5");
    methodInfo.Invoke(oReflection, new object[] { "123" });//调用方法
    
    MethodInfo methodInfo = type.GetMethod("Test5");
    methodInfo.Invoke(null, new object[] { "123" });//调用方法
    

    Invoke第一个参数为对象的实例对象或null都可。

    反射调用私有方法

                        Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                        Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                        object oReflection = Activator.CreateInstance(type);
                        MethodInfo methodInfo = type.GetMethod("Test4", BindingFlags.Instance | BindingFlags.NonPublic);
                        methodInfo.Invoke(oReflection, new object[] { "123" });
    

    反射调用普通类中的泛型方法

    MethodInfo methodGeneric = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });//确定方法的参数类型和个数
    methodGeneric.Invoke(oReflection, new object[] { 1, "Ant编程", DateTime.Now });
    

    泛型类里的泛型方法调用

    MethodInfo methodInfoNew = methodInfo.MakeGenericMethod(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
    methodInfoNew.Invoke(oReflection, new object[] { 1, "Ant编程", DateTime.Now });
    

    反射操作字段和属性等成员

      Assembly assembly = Assembly.LoadFrom("Ant.DB.SQLServer.dll");//获取DLL文件
                    Type type = assembly.GetType("Ant.DB.SQLServer.ReflectionTest");//获取到类型名称 
                    object oReflection = Activator.CreateInstance(type);
                    Student studen = new Student()
                    {
                        Id = 1,
                        StudentAddress = "xx",
                        StudentName = "giao"
                    };
    
                    foreach (var prop in type.GetProperties())
                    {
                        Console.WriteLine($"{prop.PropertyType}+{prop.Name}={prop.GetValue(studen)}");
                        Console.WriteLine("-------------------------------------------------");
                        if (prop.Name.Equals("Id"))
                        {
                            prop.SetValue(studen, 2);
                        }
                        if (prop.Name.Equals("StudentName"))
                        {
                            prop.SetValue(studen, "giao");
                        }
                        if (prop.Name.Equals("StudentAddress"))
                        {
                            prop.SetValue(studen, "1111");
                        }
                        Console.WriteLine($"{prop.PropertyType}+{prop.Name}={prop.GetValue(studen)}");
                       
                    }
    

    还有个比较简单的方式

    PropertyInfo[] propertyInfos = type.GetProperties();//查找所有的属性
    PropertyInfo propertyInfo = type.GetProperty("Id");
    
  • 相关阅读:
    Git 分支[转]
    监听键盘的输入事件[转]
    github for windows的初步使用
    限制一个form被同时打开的数量 Limite The Number of Forms Opened at the same time
    android内存检测工具
    面试 9.26 总结
    canvas path paint 的使用(游戏必备)
    android知识点
    android查缺补漏
    AIDL的使用
  • 原文地址:https://www.cnblogs.com/nice0e3/p/15541508.html
Copyright © 2020-2023  润新知