利用反射构造实例及调用类成员

利用反射技术除了可以查看类的成员信息外,当然可以构造一个类的对象,并且给它的字段赋值,调用它的方法。

 下面列出这次主要用到的类及方法

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

posted @ 2013-03-08 12:16  Net-Spider  阅读(266)  评论(0)    收藏  举报