访问默认参数值 某些语言(如 C++ 托管扩展和 Microsoft Visual Basic .NET)支持将默认值赋给参数。例如,以下示例是一个合法的 Visual Basic .NET 声明,此声明将默认值赋给两个参数。 [Visual Basic] Public Sub MyMethod (a as Integer, _ Optional b as Double = 1.2, _ Optional c as Integer=1) 您可以使用参数属性来分配默认的参数值。 通过确切指定哪些参数是默认值或略去尾部的默认参数,可以声明参数的默认值。例如,以下所有示例都是对 MyMethod 的有效调用。 [Visual Basic] MyMethod(10, 55.3, 12) MyMethod(10, 1.3) ' c == 1 MyMethod(11) ' b == 1.2, c == 1 [C#] MyMethod (10, 55.3, 12); MyMethod (10, 1.3); // c == 1 MyMethod (11); // b == 1.2, c == 1 要使用反射检索参数的默认值,请获取该参数的 ParameterInfo 对象,然后使用 ParameterInfo.DefaultValue 属性检索默认值。如果不存在默认值,该属性将返回 Value.DBNull。 以下示例向控制台显示 MyMethod 的默认值。 [Visual Basic] Dim m As MethodInfo = t.GetMethod("MyMethod") Dim ps As ParameterInfo() = m.GetParameters() Dim i As Integer For i = 0 To ps.Length - 1 Console.WriteLine("Default Value == {0}", ps(i).DefaultValue) Next i [C#] MethodInfo m = t.GetMethod ("MyMethod"); ParameterInfo[] ps = m.GetParameters(); for (int i = 0; i < ps.Length; i++) { Console.WriteLine("Default Value == {0}", ps[i].DefaultValue); } 要调用包含具有默认值的参数的方法,请使用 Type.Missing 作为 InvokeMember 方法的参数值。这样,晚期绑定服务就能够为指定的参数值使用默认值。如果为不带默认值的参数传递 Type.Missing,则将引发 ArgumentException。有一点务必要注意,并非所有编译器的绑定机制都会遵守 Type.Missing 的这些规则。有些联编程序可能不支持此功能,或者可能以不同的方式来处理 Type.Missing。当使用 Type.Missing 时,默认值不必是结尾的参数值。 C# 语言不支持默认参数。 以下 Visual Basic .NET 示例显示如何调用具有默认参数的方法。 [Visual Basic] Option Strict Off Imports System Imports System.Reflection Public Class OptionalArg Public Sub MyMethod (a As Integer, Optional b As Double = 1.2, Optional c As Integer=1) Console.WriteLine("a = " & a & " b = " & b & " c = " & c) End Sub End Class Module Module1 Sub Main() Dim o As New OptionalArg Dim t As Type t = GetType(OptionalArg) Dim Param As Object()= {10, 20, 30} t.InvokeMember("MyMethod", _ BindingFlags.Public Or _ BindingFlags.Instance Or _ BindingFlags.InvokeMethod Or _ BindingFlags.OptionalParamBinding, _ Nothing, _ o, _ New Object() {10, 55.3, 12}) t.InvokeMember("MyMethod", _ BindingFlags.Public Or _ BindingFlags.Instance Or _ BindingFlags.InvokeMethod Or _ BindingFlags.OptionalParamBinding, _ Nothing, _ o, _ New Object() {10, 1.3, Type.Missing}) t.InvokeMember("MyMethod", _ BindingFlags.Public Or _ BindingFlags.Instance Or _ BindingFlags.InvokeMethod Or _ BindingFlags.OptionalParamBinding, _ Nothing, _ o, _ New Object() {10, Type.Missing, Type.Missing}) End Sub End Module 当使用上述方法时,即使调用方未指定任何值,仍会考虑尾部的默认参数。这是调用具有默认参数的方法时最常用的方式。 如果是使用 MethodBase.Invoke 来调用方法,则需要显式指定哪些参数是默认值,指定的方法是为所有没有值的参数传递一个包含 Type.Missing 的对象数组。
|