学习反射中的动态创建对象

开发 后端
利用反射动态的创建对象一般可以使用两种方法,Assembly的CreateInstance方法。本文将介绍这两种方法。

Assembly的CreateInstance有三个重载,***个参数需要是一个字符串表示的完整的类名。第二个参数是一个bool类型,如果为true,表示对***个参数不区分大小写。

第三个: 影响执行搜索的方式的位屏蔽。此值是 System.Reflection.BindingFlags 中的位标志的组合。

 //   binder:   一个启用绑定、参数类型强制、成员调用以及通过反射进行 MemberInfo 对象检索的对象。
如果 binder 为 null,则使用默认联编程序。
//   args:  Object 类型的数组,包含要传递给构造函数的参数。此参数数组在数量、顺序和类型方面必须

与要调用的构造函数的参数匹配。如果需要默认的构造函数,则 args 必须是空数组或 null。

 //   culture:   用于控制类型强制的 CultureInfo 的实例。如果这是 null,则使用当前线程的 CultureInfo。(例如,这对于将表示 1000   的 String 转换为

Double 值是必需的,因为不同的区域性以不同的方式表示 1000。

//   activationAttributes:    包含一个或多个可以参与激活的属性的数组。通常为包含单个 System.Runtime.Remoting.Activation.UrlAttribute 对象的数组。

System.Runtime.Remoting.Activation.UrlAttribute 指定激活远程对象所需的 URL。有关客户端激活的对象的详细说明,请参见客户端激活。

Activator类的静态方法CreateInstance。

CreateInstance的***个参数说明是程序集的名称,为null时表示当前程序集;第二个参数说明要创建的类型名称。Activator.CreateInstance返回的是一个ObjectHandle对象,必须进行一次Unwrap()才能返回Object类型,进而可以强制转换成我们需要的类型(本例中是MathClass)。ObjectHandle包含在System.Runtime.Remoting命名空间中,可见它是Remoting相关的,实际上ObjectHandle类只是一个对原类型进行了一个包装以便进行封送。

无参构造:

有参构造:

动态调用 :

.使用InvokeMember调用方法

InvokeMember("方法名", BindingFlags.InvokeMethod, null,对象实例,方法参数);

静态:InvokeMember("方法名", BindingFlags.InvokeMethod, null,'类型Type',方法参数);

.MethodInfo.Invoke调用方法


MethodInfo mi = t.GetMethod("方法名"", BindingFlags.Instance | BindingFlags.Public);

mi.Invoke(对象实例, null);

静态

MethodInfo mi1 = t.GetMethod("方法名"", BindingFlags.Static | BindingFlags.Public);

Mi1.Invoke(null, 方法参数 );

用反射可以达到***程度上的多态

【编辑推荐】

  1. 详解C#编程中的反射机制与方法
  2. Java开发中类的加载及反射机制
  3. .NET反射、委托技术与设计模式
责任编辑:彭凡 来源: cnblogs
相关推荐

2021-02-01 14:10:16

JavaClass.forNaClassLoader

2010-02-04 17:05:53

C++动态创建对象

2023-09-08 14:48:41

动态共享包HSP

2009-10-13 09:05:45

反射机制

2021-03-15 08:18:23

C#反射模块

2023-10-17 09:26:44

Java工具

2012-02-08 10:12:19

Java反射

2020-04-27 07:28:00

Java反射动态代理

2011-03-29 15:27:26

SQL Server 动态管理

2011-04-11 09:39:55

对象实例

2009-08-10 13:34:11

创建C# COM对象

2021-03-11 08:10:48

JVM对象的创建School

2024-01-05 08:22:52

GlanceJetpack插件

2013-08-21 16:57:48

.NET反射

2021-03-17 07:49:21

Java对象内存

2010-10-08 10:52:36

JavaScript对

2009-08-21 08:41:44

C#反射

2010-09-09 08:52:19

JavascriptDIV

2010-06-01 09:20:45

jQuery

2018-12-19 19:30:46

JavaScript创建对象前端
点赞
收藏

51CTO技术栈公众号