首页 > 其他分享 >反射应用一InvokeMember

反射应用一InvokeMember

时间:2024-10-30 13:42:29浏览次数:5  
标签:反射 调用 obj string TestCustomerAttr BindingFlags 应用 InvokeMember type

反射是.net中的高级功能之一,利用反射可以动态的实例化类的对象,并且可以调用其方法及成员属性。所以学习好反射是很重要的。今天我就写一写简单的反射实现InvokeMember

至于关于这个函数,可以去MSDN上去查看。我只说一些和实际开发中的一些小例子。

本例子要点:如何利用InvokeMember动态实例化一个类,并且去调用类内部的方法及成员属性

讲解如下:

(1)首先我先建立一个类库,在类库里面建立一个类,供我一会利用反射动态调用,代码如下

 

复制代码
 1   public class TestCustomerAttr
 2     {
 3         private string name;
 4 
 5         public string Name
 6         {
 7             get { return name; }
 8             set { name = value; }
 9         }
10         public  string getName()
11         {
12             return "name";
13         }
14         public string getNameS(string msg)
15         {
16             return msg;
17         }
18 
19         public static string getSName()
20         {
21             return "static Name";
22         }
23   
24 
25 
26     }
复制代码

 

 

 

 

 

(2)通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类的实例,代码如下:

复制代码
 1                 //通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类
 2                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
 3                 //获得对象实例的类型
 4                 Type type = obj.GetType();
 5 
 6                 
 7                 object result = type.InvokeMember(
 8                     "getSName",   //调用的方法
 9                     BindingFlags.InvokeMethod, //使用BindingFlags.InvokeMethod枚举
10                     null, //设为空即可
11                     obj, //调用方法的对象
12                     null //调用方法的参数           
13                 );
复制代码

注意:这个是调用无参数的方法,如果有参数又该如何调用呢。代码如下:

复制代码
 1              //通过AppDomain.CurrentDomain.CreateInstanceAndUnwrap()方法动态实例化一个类
 2                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
 3                 //获得对象实例的类型
 4                 Type type = obj.GetType();
 5 
 6                 
 7                 object result = type.InvokeMember(
 8                     "getNameS",   //调用的方法
 9                     BindingFlags.InvokeMethod, //使用BindingFlags.InvokeMethod枚举
10                     null, //设为空即可
11                     obj, //调用方法的对象
12                     new string[]{"我是带参数的方法"} //调用方法的参数           
13                 );
复制代码

另外:动态实例化一个类的时候还可以用另外的一种方法,如下:

复制代码
 1 也可以用
 2    string typeName = typeof(TestCustomerAttr).AssemblyQualifiedName;
 3     Type type = Type.GetType(typeName);
 4 
 5 代替
 6 
 7                 object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
 8                 Type type = obj.GetType();
 9 
10  不过,第一种方法只适合调用静态方法
复制代码

(3)动态调用类内部的成员属性,代码如下:

复制代码
 1  object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.TestCustomerAttr");
 2                 Type type = obj.GetType();
 3 
 4 
 5                             type.InvokeMember(
 6                     "Name",   //调用的方法
 7                     BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.SetProperty, //使用BindingFlags.InvokeMethod枚举
 8                     null, //设为空即可
 9                     obj, //调用方法的对象
10                     new string[] { "aaa" } //调用方法的参数
11                 );
12 
13                 TestCustomerAttr t = (TestCustomerAttr)obj;
14                 Response.Write(t.Name);      
复制代码

 

代码完毕。

 

 转载的请注原创地址,谢谢。

标签:反射,调用,obj,string,TestCustomerAttr,BindingFlags,应用,InvokeMember,type
From: https://www.cnblogs.com/Alex80/p/18515700

相关文章

  • HarmonyOS:应用性能优化实践
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18515687➤如果链接不是为敢技术的博客园地址,则可能是......
  • 国标GB28181公网平台LiteGBS国标GB28181-2022平台应用场景探索
    在数字化时代迅猛发展的今天,视频监控技术已成为多个行业安全管理体系中的关键一环。国标GB28181公网平台LiteGBS以其出色的性能和多样化的应用范围,在提高公共服务水平和促进基层治理方式创新等方面扮演着至关重要的角色。本文将详细讨论LiteGBS在各个领域的应用情况,展示其强大的功......
  • 计算机网络(Ⅵ)应用层原理
    一些网络应用的例子:E-mail     Internaet电话Web      电子支付文本信息   搜索P2P文件共享流媒体即时通讯   实时电视会议........ 创建一个网络应用:1.编程2.在不同的端系统上运行。网络应用的体系架构可能的应用架构1.......
  • LLVM技术在GaussDB等数据库中的应用
    万物互联的态势下,数据量的激增使得“如何提升数据处理性能”成为各家数据库共同面临的挑战。作为编译优化技术的代表,基于LLVM的CodeGen技术,能为每个查询生成定制的机器码替代原本的通用函数,减少实际查询时冗余的条件逻辑判断、虚函数调用并提高数据局域性,从而达到提升查询整体性能......
  • 【移动应用设计与开发】湖南省职业院校技能大赛移动应用设计与开发赛项样题一
     智能充电家用版App(鸿蒙)【任务说明】1.进入智能充电家用版App首页,页面分为四部分,顶部显示首页标签,标签下方显示用户车辆信息,车辆信息下方显示功能按钮,底部显示菜单并位置固定。(1)用户车辆信息:包括车辆3D模型、车牌、品牌、型号和剩余里程。(2)车辆3D模型:通过旋转和缩......
  • 掌控物体运动艺术:图扑 Easing 函数实践应用
    现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用。在数字孪生领域,动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象、过程和系统,对动画的需求远远超过传统前端开发。在......
  • 3大策略+1款工具,在K8s上搞定应用零宕机
    原文链接:https://jaadds.medium.com/building-resilient-applications-on-kubernetes-9e9e4edb4d33翻译:cloudpilot.aiKubernetes提供的某些特性可以帮助企业充分利用云原生应用的优势,例如无需关闭整个集群即可更改基础设施、自动修复应用程序以及根据流量进行动态扩展。然......
  • 《使用Gin框架构建分布式应用》阅读笔记:p251-p271
    《用Gin框架构建分布式应用》学习第14天,p251-p271总结,总21页。一、技术总结1.Docker&DockerComposeversion:"3.9"services:api:image:apienvironment:-MONGO_URI=mongodb://admin:password@mongodb:27017/test?authSource=admin&readPreference=p......
  • Vue.js组件开发全面指南:从基础到高级应用
    1.Vue.js组件概述1.1什么是Vue.js组件Vue.js组件是Vue.js框架中的核心概念,它是一种封装了特定功能的可复用代码单元。每个组件可以包含自己的模板、逻辑和样式,使得开发者能够构建大型应用时,像搭积木一样组合这些独立的组件。组件基于自定义元素进行扩展,使得开发者能够创......
  • 操作系统(7) (POSIX--Linux线程编程---使用多线程计算平方pthread_t/create/join应用)
    1.代码目的我们希望创建一个程序:启动多个线程,每个线程计算一个数字的平方值。每个线程将计算结果返回给主线程。主线程接收每个线程的返回值,并将结果打印出来。在这个例子中,我们通过传递不同的参数给每个线程,来让每个线程计算不同数字的平方值。2.代码实现以下是代码的......