利用反射构造实例及调用类成员
利用反射技术除了可以查看类的成员信息外,当然可以构造一个类的对象,并且给它的字段赋值,调用它的方法。
下面列出这次主要用到的类及方法
Assembly:使用 Assembly 类可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例。
| 返回类型 | 方法名 | 说明 |
| Assembly | Load(String) | 通过给定程序集的长格式名称加载程序集。 |
| Type | GetTypes | 获取此程序集中定义的类型。 |
| Object | CreateInstance(String, Boolean) | 使用可选的区分大小写搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。 |
| Object | CreateInstance(String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[]) | 从此程序集中查找指定的类型,并使用系统激活器创建它的实例,包括可选的区分大小写搜索并具有指定的区域性、参数和绑定及激活特性。 |
PropertyInfo:介绍略
| 返回类型 | 方法名 | 说明 |
| void | SetValue(Object, Object, Object[]) | 用索引化属性的可选索引值设置指定对象的该属性值。 |
MethodInfo:介绍略
| 返回类型 | 方法名 | 说明 |
| Object | Invoke(Object, Object[]) | 使用指定的参数调用当前实例所表示的方法或构造函数。 (继承自 MethodBase。) |
下面给出示例(被反射的Human类及Sex枚举与 《利用反射查看类成员》 文中一样)
Main方法代码
//存放将要构造对象的信息 Dictionary<string, object> objValue = new Dictionary<string, object>(); objValue["Name"] = "Tom"; objValue["Sex"] = true; objValue["Age"] = 18; Assembly assembly = Assembly.Load("Client"); Type cType = assembly.GetType("Client.Human");//用类的完全限定名 //调用不带参数的构造函数 object obj = assembly.CreateInstance("Client.Human", true);//用类的完全限定名 //调用带参数的构造函数 //object obj = assembly.CreateInstance("Client.Human", true, BindingFlags.Default, null, new object[] {"",0,false }, null, null); //给字段赋值 PropertyInfo[] objProInfos = cType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo pi in objProInfos) { if(objValue.ContainsKey(pi.Name)) pi.SetValue(obj, objValue[pi.Name], null); } //调用方法 type.GetMethod("Introduce").Invoke(obj, null); Console.WriteLine(type.GetMethod("GuessMySex").Invoke(obj,new object[]{Sex.Woman}));
运行结果:
Hello my name is Tom ,I'm 18 .
False

浙公网安备 33010602011771号