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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • python获取文件名不含后缀名_python文件扩展名主要有

    python获取文件名不含后缀名_python文件扩展名主要有获取文件的后缀名有好几种方法:第一种:splittext()方法os.path.splittext(path)[-1]第二种:endswith()方法path=”test_user_info.py”bool=path.endswith(“.py”)print(bool)第三种:判断后缀名是否在字符串中(这种会存在误判,若是.pyx后缀,一样会打印True,前面两种不会)path=”test_user_info.py”if”.py”inpath:

    2022年9月22日
  • 基于java springboot android安卓点餐外卖系统源码(毕设)「建议收藏」

    基于java springboot android安卓点餐外卖系统源码(毕设)「建议收藏」开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),AndroidStudio技术说明:springbootmybatisandroid代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册首页显示轮播图,菜品分类,根据分类展示菜品(可带推荐算法),点击入购物车,然后点击结算,计入下单界面,可选择自取和配送(配送需选择地址);也可以点击菜品进入详情,详情展示菜品评价,可以点击下单订单展示个人订单信息(包含取消,支付,完

    2022年6月19日
  • 在树莓派4B上使用YOLO v3 Tiny进行实时目标检测

    在树莓派4B上使用YOLO v3 Tiny进行实时目标检测首先尝试使用yolo官网yolo给的教程,在树莓派上测试,但是在运行时出现段错误,尝试很多方法无法解决。在国外的网站找到darknet-nnpack这个东西,可以完美的在树莓派上运行。参考的文章darknet-nnpackhttps://github.com/zxzhaixiang/darknet-nnpackFunofDIYhttp://funofdiy.blogspot.c…

    2022年6月9日
  • 二叉树层序遍历实现

    二叉树层序遍历实现二叉树的层序遍历下图是一个简单的二叉树例图实现思路:1.创建一个队列用于二叉树的层序遍历。2.将二叉树根节点插入队列中。3.通过while循环遍历二叉树,直至遍历完整个二叉树后则结束循环。4.每次循环开始时先进行出队操作,若当前出队元素为null则证明已经完成层序遍历结束循环循环,若不为null则打印该节点的值,并判断该节点是否存在左右子树,若存在则依次插入队列中。图解上述二叉树的层序遍历过程依次进行图上操作直至最终队列为空时则层序遍历结束。实现代码如下:classTreeNod

    2022年5月11日
  • 深入理解Java虚拟机–javac命令[通俗易懂]

    深入理解Java虚拟机–javac命令[通俗易懂]目录指定编译源文件命令选项非标准选项-Xjavac命令用于将.java源文件编译成.class字节码文件,在windows命令行中使用”javac-help”命令查看其用法:语法格式:javac<options><sourcefiles>options#命令行选项,可指定多个…

    2022年5月28日
  • 搭建私人邮件服务器

    搭建私人邮件服务器怎样使用本地服务器搭建一个邮箱,这样就可以脱离qq或者其他企业邮箱的限制,即可以做到节省成本,又可以得到收发邮件的一个保密性。这里我们先展示一下本地搭建邮箱服务器后的成功例子:可以看到,这里qq邮箱收到我这边发送的一个测试邮件例子(特别说明一下,这里的wordcap.top是我自己购买的一个域名)同样qq也可以向我发送邮件:怎样搭建一个属于自己的私人邮箱服务器了,我这里演示一遍:准…

    2022年5月20日

发表回复

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

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