Zugreifen auf Standardargumentwerte
Aktualisiert: November 2007
Einige Sprachen (z. B. Visual C++ und Microsoft Visual Basic 2005) unterstützen die Zuweisung von Standardwerten für Argumente. Im folgenden Beispiel wird eine gültige Deklaration in Visual Basic 2005 veranschaulicht, 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 mithilfe der 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 über Standardwerte verfügen, 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 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 über die 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 die Standardargumente explizit festlegen, indem Sie ein Objektarray übergeben, das Type.Missing für alle Parameter ohne Wert enthält.