反射机制(2)动态创建并调用对象
来源:互联网 发布:impala apache hadoop 编辑:程序博客网 时间:2024/05/16 11:16
示例通用对象:
namespace Test{ class User //通用User类 { private string name; public User() { name = "zhangsan"; } public User(string value) { name = value; } public string getName() { return "this is " +name + "!"; } public string showName(string father,string monther) { return father +" and " + monther +"'s son is " + name ; } }}
一、创建对象通常有2种方式:
1、使用Assembly类的CreateInstance方法:
CreateInstance方法有3个重载函数:
(1)public Object CreateInstance (string typeName) //从程序集中查找指定的typeName并创建它,查找typeName时区分大小写
typeName参数:表示要创建的类型实例的名称。
(2)public Object CreateInstance (string typeName,bool ignoreCase) // 从程序集中查找指定的typeName并创建它
ignoreCase参数:表示是否忽略大小写查找typeName,true = 忽略大小写,false = 区分大小写。
(3)public Object CreateInstance (string typeName,bool ignoreCase,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo culture,Object[]
activationAttributes)
bindingAttr参数:限定查找的类型。
binder参数:一个启用绑定、参数类型强制、成员调用以及通过反射进行 MemberInfo 对象检索的对象。如果binder 为null,则使用默认联编程序。
args参数:包含要传递给构造函数的参数。
culture参数:用于控制类型强制的 CultureInfo 的实例。例如将100强制转换成Double类型。null则使用当前线程的 CultureInfo。
activationAttributes参数:包含一个或多个可以参与激活的激活属性。
示例: //无参构造函数创建对象 Object obj = Assembly.GetExecutingAssembly().CreateInstance("Test.User",true); //有参构造函数创建对象 Object[] paramters = new Object[1]; paramters[0] = "lisi"; //BindingFlags.Default表示不指定绑定标志。 Object obj = Assembly.GetExecutingAssembly().CreateInstance("Test.User",true,BindingFlags.Default,null,paramters,null,null);2、调用Activator类的静态方法CreateInstance:
CreateInstance方法共有14个重载函数,这里只讲几个常用的:
(1)public static Object CreateInstance (Type type)
type参数:要创建的对象的类型。
(2)public static Object CreateInstance (Type type,params Object[] args)
args参数:包含要传递给构造函数的参数。
(3)public static ObjectHandle CreateInstance (string assemblyName,string typeName)
assemblyName参数:指定查找typeName的程序集的名称。null表示当前程序集。
typeName参数:表示要创建的类型实例的名称。
注意:参数返回的是ObjectHandle类型,必须进行一次Unwrap()才能返回Object类型。
(4)public static ObjectHandle CreateInstance (string assemblyName,string typeName,bool ignoreCase,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo culture,Object[] activationAttributes,Evidence securityInfo)
参数说明同上Assembly类的CreateInstance方法的重载函数(3)。
注意:参数返回的是ObjectHandle类型,必须进行一次Unwrap()才能返回Object类型。
(5)public static Object CreateInstance (Type type,BindingFlags bindingAttr,Binder binder,Object[] args,CultureInfo culture,Object[] activationAttributes)
参数说明同上。
示例: //无参构造函数创建对象 System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(null, "Test.User"); Object obj = oh.Unwrap(); //有参构造函数创建对象 Object[] paramters = new Object[1]; paramters[0] = "lisi"; System.Runtime.Remoting.ObjectHandle oh = Activator.CreateInstance(null, "Test.User",false,BindingFlags.CreateInstance,null,paramters,null,null,null); Object obj = oh.Unwrap();
二、调用对象通常也有2种方式:
1、使用Type类的InvokeMember方法:
InvokeMember方法有3个重载函数:
(1)public Object InvokeMember (string name,BindingFlags invokeAttr,Binder binder,Object target,Object[] args)
name参数:表示要调用的构造函数、方法、属性或字段成员的名称。
invokeAttr参数:限定查找的类型。如果是调用对象方法的话,通常为BindingFlags.InvokeMethod,调用对象属性时,为BindingFlags.GetProperty;而如果是创建对象的话,为BindingFlags.CreateInstance。
binder参数:一个启用绑定、参数类型强制、成员调用以及通过反射进行 MemberInfo 对象检索的对象。如果binder 为null,则使用默认联编程序。
target参数:表示要在其上调用指定成员的 Object。
args参数:包含传递给要调用的成员的参数的数组。
(2)public Object InvokeMember (string name,BindingFlags invokeAttr,Binder binder,Object target,Object[] args,CultureInfo culture)
culture参数:用于控制类型强制的 CultureInfo 的实例。例如将100强制转换成Double类型。null则使用当前线程的 CultureInfo。
(3)public abstract Object InvokeMember (string name,BindingFlags invokeAttr, Binder binder,Object target,Object[] args,ParameterModifier[] modifiers,CultureInfo culture, string[] namedParameters)
modifiers参数:ParameterModifier 对象数组,表示与 args 数组中的相应元素关联的属性 (Attribute)。
namedParameters参数:包含参数名称的数组,args 数组中的值被传递给这些参数。
备注:Type.InvokeMember方法不仅可以用于调用对象,也可可以用于创建对象。
示例: //无参创建对象 Object obj = Assembly.GetExecutingAssembly().CreateInstance("Test.User",true); Type myType = typeof(Test.User); //调用无参方法getName string result = (string)myType.InvokeMember("getName",BindingFlags.InvokeMethod,null,obj,null); Console.WriteLine(result); //运行结果为This is zhangsan! Object[] paramters = new Object[2]; paramters[0] = "sam"; paramters[1] = "john"; //调用有参方法showName并传递2个参数 string result = (string)myType.InvokeMember("showName", BindingFlags.InvokeMethod, null, obj,paramters); Console.WriteLine(result); //运行结果为sam and john's son is zhangsan
示例://遍历Color类的所有颜色 Type colorType = typeof(System.Drawing.Color); PropertyInfo[] pis = colorType.GetProperties(BindingFlags.Static | BindingFlags.Public); foreach (PropertyInfo pi in pis) { System.Drawing.Color c = (System.Drawing.Color)colorType.InvokeMember(pi.Name, BindingFlags.GetProperty, null, colorType, null); Console.WriteLine("{0} (R:{1},G:{2},B:{3})",c.Name,c.R, c.G, c.B ); } 运行结果: Transparent (R:255,G:255,B:255) AliceBlue (R:240,G:248,B:255) AntiqueWhite (R:250,G:235,B:215) Aqua (R:0,G:255,B:255) Aquamarine (R:127,G:255,B:212) Azure (R:240,G:255,B:255) Beige (R:245,G:245,B:220) Bisque (R:255,G:228,B:196) Black (R:0,G:0,B:0) BlanchedAlmond (R:255,G:235,B:205) .... ....
2、使用MethodInfo类的Invoke方法:
Invoke方法有2个重载函数:
(1)public Object Invoke ( Object obj,Object[] parameters)
obj参数:对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为空引用。
parameters参数:调用的方法或构造函数的参数列表。
返回值:包含被调用方法的返回值,如果调用的是构造函数,则为空引用。
(2)public abstract Object Invoke (Object obj,BindingFlags invokeAttr,Binder binder,Object[] parameters,CultureInfo culture)
参数说明同上Assembly类的CreateInstance方法的重载函数(3)。
示例: //创建对象 Object obj = Assembly.GetExecutingAssembly().CreateInstance("Test.User", true); Type myType = typeof(Test.User); MethodInfo mi = myType.GetMethod("getName"); //调用无参方法 string result = (string)mi.Invoke(obj,null); Console.WriteLine(result); //运行结果为This is zhangsan! MethodInfo mi = myType.GetMethod("showName"); Object[] paramters = new Object[2]; paramters[0] = "sam"; paramters[1] = "john"; //调用有参方法 string result = (string)mi.Invoke(obj,paramters); Console.WriteLine(result); //运行结果为sam and john's son is zhangsan
- 反射机制(2)动态创建并调用对象
- 利用java反射机制动态创建对象
- 通过Java的反射机制创建运行时类的对象并调用其结构
- [Java]利用反射机制动态加载并创建包含参数的对象
- 反射动态创建对象
- java反射机制(2)- 实践:反射机制+动态代理实现模拟RMI远程方法调用
- C#通过反射来动态创建类对象并调用相关泛型函数(Excel数据自动导入到SQL Server数据库)
- 反射机制学习2(构造方法创建对象)
- 反射机制进行动态调用的两种创建方法实例与hama中的反射机制
- Java反射机制创建对象
- java反射机制创建对象
- Java反射机制创建对象
- Java反射机制创建对象
- Java反射机制创建对象
- JAVA反射机制创建对象
- 反射机制学习1(反射创建对象)
- java基础-反射3(反射,反射创建对象,操作对象属性,调用对象方法)
- 利用反射动态创建对象
- 我们阅读的根本目的
- Android入门介绍
- 谷歌地图两点坐标计算
- 各级别.NET技术人员必须具备的知识
- Maven :web项目同时打包成war和jar
- 反射机制(2)动态创建并调用对象
- 关于mysql数据库
- c# 高级技术--反射
- Kinect for Windows SDK开发入门(三):基础知识 下
- totalCMD不显示快盘文件夹的问题
- 程序员,请昂起你高贵的头!
- Linux email邮件服务器配置(postfix)
- 利用SpringRoo进行快速开发1
- c#写扩展方法