【原创】反射应用一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);      

代码完毕。

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

原文地址:https://www.cnblogs.com/yxhblog/p/2537006.html