存取預設引數值

更新:2007 年 11 月

有些語言 (例如 Visual C++ 和 Microsoft Visual Basic 2005) 可支援將預設值指派給引數。例如,下列程式碼範例為合法的 Visual Basic 2005 宣告,其中兩個引數含有預設值。

Public Sub MyMethod (a as Integer, _
                     Optional b as Double = 1.2, _
                     Optional c as Integer = 1)

您可以使用參數屬性指派預設參數值。

在 Visual Basic 和 C++ 中,當呼叫此方法時,可以省略選擇性參數。在 C# 中,必須為選擇性引數指定值。

例如,下列所有的 Visual Basic 和 C++ 範例全都是對於 MyMethod 有效的呼叫。

MyMethod(10, 55.3, 12)
MyMethod(10, 1.3) ' c == 1
MyMethod(11) ' b == 1.2, c == 1
MyMethod(10, 55.3, 12);
MyMethod(10, 1.3);   // c == 1
MyMethod(11);        // b == 1.2, c == 1

若要使用反映擷取引數的預設值,請取得參數的 ParameterInfo 物件,並接著使用 ParameterInfo.DefaultValue 屬性擷取預設值。如果沒有預設值,屬性會傳回 Value.DBNull

下列範例將 MyMethod 的預設值顯示至主控台。

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
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);
}
MethodInfo m = t->GetMethod("MyMethod");
ParameterInfo[] ps = m->GetParameters();
for (int i = 0; i < ps.Length; i++) 
{
    Console::WriteLine(S"Default Value == {0}", ps[i]->DefaultValue);
}

若要叫用具有預設值引數的方法,請使用 Type.Missing 當做 InvokeMember 方法的參數值。這讓晚期繫結服務能夠使用指示的參數值的預設值。如果 Type.Missing 傳遞給沒有預設值的參數,將會擲回 ArgumentException。很重要的一點是,並非所有編譯器的繫結機制都會遵守這些 Type.Missing 規則。某些繫結器可能不支援這個功能,或者可能以不同方式來處理 Type.Missing。使用 Type.Missing 時,預設值不一定要在後面。

C# 語言不支援預設引數。

下列 Visual Basic 2005 範例將示範如何使用反映來叫用有預設引數的方法。

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 的物件陣列給沒有值的所有參數,以明確指定哪些引數為預設值。

請參閱

概念

檢視型別資訊

參考

Type.Missing

Reflection.Missing

MethodBase.Invoke

InvokeMember