Reflection反射有四种表现方式:
1.查看元数据metadata(通过attributes特性表示的),用于显示等
2.类型的发现(类型、类型中定义的属性、方法、事件等)
3.推迟绑定对象,可以动态实例化对象并调用方法
4.动态创建新的类型
类型发现的实例:
//读取库 Assembly a = Assembly.Load("Mscorlib.dll"); //读取库的所有类型,存入数组 Type[] types = a.GetTypes(); //读取一个类 Type theType = Type.GetType("System.Reflection.Assembly"); //读取类的所有成员,包含方法、属性、事件等等 MemberInfo[] mbrInfoArray = theType.GetMembers(); //只获取成员方法 MemberInfo[] mbrInfoArray = theType.GetMethods(); //根据条件查询所有类型的成员,比如只获取名字以Get开头的方法 MemberInfo[] mbrInfoArray = theType.FindMembers(MemberTypes.Method, BindingFlags.Default, Type.FilterName, "Get*");
动态读取类、生成实例、及调用方法的例子:
//读取库/获取类型,创建对象实例 Type theMathType = Type.GetType("CustomMath"); Object theObj = Activator.CreateInstance(theMathType); //创建参数类型 Type[] paramTypes = new Type[1]; paramTypes[0]= Type.GetType("System.Double"); //获取类型中的方法,这里需要对类型中方法有一定认识,不然就不知道调用哪个方法,导致程序不可控 MethodInfo CosineInfo = theMathType.GetMethod("Cos", paramTypes); //生成参数 Object[] parameters = new Object[1]; parameters[0] = 45; //调用实例方法 Object returnVal = CosineInfo.Invoke(theObj, parameters);
动态创建新的类型(reflection emit反射发出),一般用的比较少。