反射是.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