c# 反射调用

c#反射调用反射加载DLLAssemblyassembly=Assembly.Load("Ant.DB.SQLServer");//加载方式一:dll文件名(当前目录)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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");
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119827.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 文件读取(FileInputStream 读取本地文件)

    文件读取(FileInputStream 读取本地文件)使用FileInputStream读取本地文件(图片、视频、音乐、文档资料)二进制文件、文本文件1.在物理存储上上没有什么区别,存在硬盘上都是以二进制方式存储2.解释数据的逻辑不同,程序读取文本文件,可以以字符方式读取,也可以以字节读取,将读取的数据解释为ASCII或者unicode编码;当程序读取二进制文件,以字节方式读取,对读取数据的解释由读取数据而定,如读取图片时,需要了解文件的结…

    2022年5月26日
    48
  • TCP的三次握手与四次挥手理解及面试题(很全面)

    TCP的三次握手与四次挥手理解及面试题(很全面)本文经过借鉴书籍资料、他人博客总结出的知识点,欢迎提问序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文…

    2022年5月5日
    36
  • python机器学习库sklearn——Lasso回归(L1正则化)

    python机器学习库sklearn——Lasso回归(L1正则化)全栈工程师开发手册(作者:栾鹏)python数据挖掘系列教程TheLasso是估计稀疏系数的线性模型。它在一些情况下是有用的,因为它倾向于使用具有较少参数值的情况,有效地减少给定解决方案所依赖变量的数量。因此,Lasso及其变体是压缩感知领域的基础。在一定条件下,它可以恢复一组非零权重的精确集。在数学公式表达上,它由一个带有ℓ1\ell_1先验的正则项的线性模型组成。

    2022年6月14日
    39
  • 数据结构:八大数据结构分类

    数据结构分类数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示:每一种数据结构都有着独特的数据存储方式,下面为大家介绍它们的结构和优缺点。1、数组数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始…

    2022年4月6日
    62
  • VSCode配置 c++ 环境(小白教程)「建议收藏」

    VSCode配置c++环境(小白教程)

    2022年4月17日
    31
  • BurpSuit暴力激活成功教程密码

    BurpSuit暴力激活成功教程密码暴力激活成功教程原理暴力激活成功教程是用户自定义字典文件中的内容与验证程序交互,从而在枚举过程中得到正确数据案例:激活成功教程用户名、密码激活成功教程验证码-之前四位数的手机验证码在未进行任何防护措施,导致被枚举出来暴力激活成功教程的基础应用程序或服务器未进行限制具有内容涵盖全方面的字典文件暴力激活成功教程方式根据激活成功教程的验证码内容是否处于服务状态将暴力激活成功教程分为以下两类:1.在线激活成功教程2.离线激活成功教程无论是在线还是离线是否可以…

    2022年8月22日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号