反射应用一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);
代码完毕。
转载的请注原创地址,谢谢。

浙公网安备 33010602011771号