反射应用一InvokeMember

反射是.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);      
复制代码
复制代码

 

代码完毕。

 

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

posted on   大西瓜3721  阅读(12)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-10-30 如何禁用Visual Studio 2013的浏览器链接功能
2015-10-30 Asp.Net MVC 4 Web API 中的安全认证-使用OAuth
2015-10-30 MVC 自定义AuthorizeAttribute实现权限管理

导航

点击右上角即可分享
微信分享提示