首页/技术开发/内容

动态装载与使用分类

技术开发2024-01-30 阅读()
[摘要]BindingFlags.Static;//Case 1. Neither argument coercion nor memberselection is needed.args = new Ob...
BindingFlags.Static;

//Case 1. Neither argument coercion nor memberselection is needed.
args = new Object[] {};
t.InvokeMember ("PrintBob", flags,binder, null, args);

//Case 2. Only member selection is needed.
args = new Object[] {42};
t.InvokeMember ("PrintValue", flags,binder, null, args);

//Case 3. Only argument coercion is needed.
args = new Object[] {"5.5"};
t.InvokeMember ("PrintNumber",flags, binder, null, args);
}

public static void PrintBob ()
{
Console.WriteLine ("PrintBob");
}

public static void PrintValue (long value)
{
Console.WriteLine ("PrintValue ({0})",value);
}
public static void PrintValue (String value)
{
Console.WriteLine ("PrintValue\"{0}\")",value);
}

public static void PrintNumber (double value)
{
Console.WriteLine ("PrintNumber ({0})",value);
}
}


当存在多于一个的同名成员时,就需要有重载解析。Binder.BindToMethod 和Binder.BindToField 方法可以用来绑定到一个成员。Binder.BindToMethod也可以通过get 和set 属性访问器提供属性解析。

BindToMethod 返回可被调用的MethodBase. 如无可用的调用则返回null. 如果无法调用,BindToMethod 返回 MethodBase 为 调用或 null。MethodBase返回值无需是match参数之一,尽管事实往往如此。

调用者 也许会想得到ByRef 参数的返回。所以,如果BindTo方法改动过参数数组,Binder 允许客户使参数数组映射回它原来的表格。为了实现这点,调用者必须确保参数顺序不变。当参数由名字传递,Binder重新整理参数组,以供调用者察看。

可用成员是指那些在类型或任何基本类型中定义的那些成员。如果指明BindingFlags.NonPublic,任何访问级别的成员都会在返回中。如果BindingFlags.NonPublic 没有被指明,binder必须执行访问规则。当指明Public或 NonPublic 绑定标志, 你必须也指明Instance 或Static 标志, 否则不会有成员返回。

如果只有一个成员与名字对应,就不需要回调,也就完成到这个方法的绑定。Case 1 中的代码例子表明了这一点:只有一个可用的PrintBob 方法, 所以,不需要回调。

如在可用集中,有多于一个成员。所有这些方法被传递给BindTo方法, 再由它选择适当的方法,并且返回。在 Case 2 中的代码例子中,有两种叫做PrintValue的方法。合适的方法取决于对BindToMethod调用。

ChangeType 执行参数转换, 它把实际参数转变为选定方法的参数类型。即使类型已经完美匹配,ChangeType也会针对每个参数被调用。

在 Case 3 中的代码例子中, 值为"5.5"的String类型的一个实际参数以正式参数Double类型被传递给方法。要想调用成功,字符串值"5.5"必须被转变为一个double值。ChangeType 执行了这种转变。

ChangeType 仅执行无损失转换, 如下表所示:
Source Type Target Type
Any type Its base type
Any type Interface it implements
Char UInt16, UInt32, Int32, UInt64, Int64, Single, Double
Byte Char, UInt16, Int16, UInt32, Int32, UInt64, Int64, Single, Double
SByte Int16, Int32, Int64, Single, Double
UInt16 UInt32, Int32, UInt64, Int64, Single, Double
Int16 Int32, Int64, Single, Double
UInt32 UInt64, Int64, Single, Double
Int32 Int64, Single, Double
UInt64 Single, Double
Int64 Single, Double
Single Double
Non-reference type Reference type

Type类有Get方法,可使用Binder类型的参数的来解析对某成员的引用。Type.GetConstructor,Type. GetMethod , 和 Type.GetProperty 通过提供某成员的签名信息来查找该成员。它们调用Binder.SelectMethod和Binder.SelectProperty 以选择适合方法的签名信息。

第1页  第2页  第3页  第4页 

……

相关阅读