通过晚期绑定调用方法成员

来源:互联网 发布:sql无法删除表 编辑:程序博客网 时间:2024/04/27 13:39

晚(后)期绑定:若将一个变量声明为object,编译时不知道程序集是否存在,也无法确定该变量将引用哪种类型的对象,在程序中创建该程序集指定类型的实例,并调用其成员,这就是晚期绑定。

        在运行时确定对象的属性和方法能否使用该变量。对进程外部件而言,这意味着一次额外的跨进程方法调用,增加额外开销。

        在调用外部的COM自动化组件时,如Office,如果通过这种方式调用,对于不同版本的Office,如果你调用的方法、属性都是存在的,那么可以适应不同版本的Office,但如果通过前期绑定,在项目引用中确定对象类型,是有版本兼容问题的。

 

早(前)期绑定:当显式声明了变量的类时,例如 As Int32,该变量就只能存放该类的对象的引用,在编译时就能知道属性或方法所属的对象。

 

本例程序首先定义3个外部类项目OldClass,NewClass,MyClass,并编译为dll程序集,建立一个主程序项目LateBinding,添加3个外部类项目的dll引用。

第一个外部类项目OldClass:

第二个外部类项目NewClass:

第三个外部类项目MyClass:

主程序类项目LateBinding:

 

一、LoadOldClass()方法和LoadNewClass()方法的晚期绑定通过如下的InvokeMember()方法调用指定对象的成员。

//调用Type对象oldTpInvokeMember方法,传递相应的参数,方法返回为Object类型,使用转换为string

string txt = (string)oldTp.InvokeMember("Method", BindingFlags.InvokeMethod, null, null, oldList);

 

InvokeMember方法:

public Object InvokeMember (

     string name,

     BindingFlags invokeAttr,

     Binder binder,

     Object target,

     Object[] args

)

参数:

name

String类型,它包含要调用的构造函数、方法、属性或字段成员的名称。

- 或 - 空字符串 (""),表示调用默认成员。

- 或 -对于 IDispatch 成员,则为一个表示 DispID 的字符串,例如“[DispID=3]”。

 

invokeAttr

一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public |BindingFlags.Instance。

 

binder

一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。

- 或 -

若为空引用(在 Visual Basic 中为 Nothing),则使用 DefaultBinder。

 

target

要在其上调用指定成员的 Object。

 

args

包含传递给要调用的成员的参数的数组。

 

返回值

表示被调用成员的返回值的 Object。

 

二、LoadMyClass()方法的晚期绑定通过如下代码调用指定对象的成员。

            //通过myTp.GetMethod()搜索参数指定的方法

            MethodInfo mi = myTp.GetMethod("Method");

 

            //定义仅一个参数的数组(因调用的NewClass类中的方法Method()只有一个参数)

            string[] myList = new string[1] { input };

 

            //调用MethodInfo对象miInvoke方法,传递相应的参数,方法返回为Object类型,使用转换为string

            string txt = (string)mi.Invoke(myObj,myList);

Invoke方法:

public Object Invoke(

     Object obj,

     Object[] parameters

)

参数

obj

类型:System.Object

对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。

 

parameters

类型:System.Object[]

调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters 应为 null。

如果此实例所表示的方法或构造函数采用 ref 参数(在 Visual Basic 中为 ByRef),使用此函数调用该方法或构造函数时,该参数不需要任何特殊特性。如果数组中的对象未用值来显式初始化,则该对象将包含该对象类型的默认值。对于引用类型的元素,该值为 null。对于值类型的元素,该值为 0、0.0 或 false,具体取决于特定的元素类型。

 

返回值

类型:System.Object

一个对象,包含被调用方法的返回值,如果调用的是构造函数,则为 null。

 

三、创建外部程序集指定类型的实例也可以通过以下方法

//创建当前应用程序域的指定程序集中指定类型的实例

object obj = AppDomain.CurrentDomain.CreateInstanceAndUnwrap("NewClass", "LateBinding.NewClass");

 

AppDomain.CurrentDomain.CreateInstanceAndUnwrap(“程序集名称”,”命名空间.类名”)

 

 

 

原创粉丝点击