1.引入命名空间
using System.Reflection 才能使用相关的类
因为是用窗体应用做测试,所以还要引用输出窗口做打印, using System.Diagnostics
2.新建一个测试类 MyClass (文件名不影响类名),并单独放一个空间 myspace中
新建的测试类要包括private私有成员和public公有成员和static静态成员,方便测试全面
代码如下:
using System;
using System.Diagnostics;
namespace mySpace {
public class MyClass {
private static int number;
private int id=0;
public String name;
private MyClass() {
}
public MyClass(String name) {
this.name = name;
}
public int getId() {
return id;
}
private String testPrivateMethod(String s1 , int s2) {
Debug.WriteLine("");
Debug.WriteLine("private {0} {1}",s1,s2);
return "private "+s1+" "+s2;
}
}
}
重点看下属性 id 和方法 testPrivateMethod是私有的
3.反射操作如下,所有的逻辑是写在一个按钮的点击事件中,可自行修改
private void button1_Click(object sender, EventArgs e) {
mySpace.MyClass myclass = new mySpace.MyClass("liuyan");
//获取所有成员
Type type = typeof(mySpace.MyClass);
//范围设置如下
//BindFlags.NonPublic 非public公共成员
//BindFlags.Instance 类实例,要通过反射调用,这个必须引入
//BindFlags.Public public公共成员
//BindFlags.Static 静态成员
//BindFlags.DeclaredOnly 不获取父类成员,只获取本身类的成员
//MemberInfo[] infos = type.GetMembers(); 只获取公共成员
MemberInfo[] infos = type.GetMembers(
BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|
BindingFlags.DeclaredOnly|BindingFlags.Static
);
//成员类型有(Method.Filed.Constructor)
foreach (MemberInfo info in infos) {
Debug.WriteLine("成员名: {0} 类型: {1}",info.Name,info.MemberType);
}
//获取单个属性Field成员
//myclass.id; //不能访问到,且不能设值,因为id是私有的,下面通过反射操作:
FieldInfo field = type.GetField("id",BindingFlags.NonPublic|BindingFlags.Instance);
field.SetValue(myclass,2018);
Debug.WriteLine("");
Debug.WriteLine(field.GetValue(myclass));
//获取单个方法Method成员
//myclass.testPrivateMethod("newvalue",2018) //无法操作,因为该方法私有,下面通过反射操作:
MethodInfo method = type.GetMethod("testPrivateMethod",BindingFlags.NonPublic|BindingFlags.Instance);
//Debug.WriteLine(method.ReturnType); //方法返回类型
//invoke:调用的意思
//参数需传入Object[]{}
method.Invoke(myclass,new Object[] {"newvalue",2018 });
//通过MemberInfo获取单个成员
//member.toString()包含了成员名和(成员类型或返回值类型)
MemberInfo member1 = type.GetMember("id", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)[0];
Debug.WriteLine("");
Debug.WriteLine("成员名: {0} 类型: {1} {2}", member1.Name, member1.MemberType, member1.ToString());
MemberInfo member2 = type.GetMember("name", BindingFlags.Public|BindingFlags.NonPublic | BindingFlags.Instance)[0];
Debug.WriteLine("");
Debug.WriteLine("成员名: {0} 类型: {1} {2}",member2.Name,member2.MemberType,member2.ToString());
MemberInfo member3 = type.GetMember("testPrivateMethod", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)[0];
Debug.WriteLine("");
Debug.WriteLine("成员名: {0} 类型: {1} {2}", member3.Name, member3.MemberType, member3.ToString());
}