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反射发出),一般用的比较少。
本文详细介绍了C#中的反射技术,包括元数据查看、类型发现、动态实例化对象及调用方法等方面的内容,并提供了实际应用的代码示例。

938

被折叠的 条评论
为什么被折叠?



