Zugreifen auf Standardargumentwerte

Einige Sprachen (z. B. Visual C++ und Microsoft Visual Basic 2005) unterstützen die Zuweisung von Standardwerten an Argumente. Folgendes Beispiel zeigt eine gültige Deklaration in Visual Basic 2005, die Standardwerte für zwei Argumente enthält.

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

Für die Zuweisung von Standardwerten für Parameter lassen sich Parameterattribute verwenden.

In Visual Basic und C++ können optionale Parameter beim Aufruf der Methode weggelassen werden. In C# müssen für optionale Argumente Werte angegeben werden.

Die folgenden Beispiele in Visual Basic und C++ sind gültige Aufrufe von 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

Um den Standardwert eines Arguments unter Verwendung von Reflektion abzurufen, ermitteln Sie das ParameterInfo-Objekt für den Parameter. Anschließend rufen Sie den Standardwert mit der ParameterInfo.DefaultValue-Eigenschaft ab. Wenn kein Standardwert vorhanden ist, gibt die Eigenschaft Value.DBNull zurück.

Im folgenden Beispiel werden die Standardwerte für MyMethod auf der Konsole ausgegeben:

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);
}

Um Methoden aufzurufen, deren Argumente Standardwerte enthalten, verwenden Sie Type.Missing als Parameterwert für die InvokeMember-Methode. Dadurch kann bei der späten Bindung der Standardwert für den angegebenen Parameterwert verwendet werden. Bei der Übergabe von Type.Missing für einen Parameter ohne Standardwert wird eine ArgumentException-Ausnahme ausgelöst. Beachten Sie unbedingt, dass nicht alle Bindungsmechanismen der Compiler diese Regeln für Type.Missing respektieren. Einige Binder unterstützen diese Funktionen möglicherweise nicht oder behandeln Type.Missing anders. Wenn Sie Type.Missing verwenden, müssen die Standardwerte keine Schlussfolge bilden.

Die Sprache C# unterstützt keine Standardargumente.

Im folgenden Visual Basic 2005-Beispiel wird veranschaulicht, wie Methoden mit Standardargumenten anhand von Reflektion aufgerufen werden.

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

Mit der beschriebenen Technik werden nachfolgende Standardargumente auch berücksichtigt, wenn der Aufrufer keinen Wert festlegt. Dies ist der übliche Weg, um Methoden mit Standardargumenten aufzurufen.

Wenn Sie MethodBase.Invoke für den Methodenaufruf verwenden, müssen Sie explizit die Standardargumente festlegen, indem Sie ein Objektarray übergeben, das Type.Missing für alle Parameter ohne Wert enthält.

Siehe auch

Referenz

Type.Missing
Reflection.Missing
MethodBase.Invoke
InvokeMember

Konzepte

Anzeigen von Typinformationen