Accesso ai valori predefiniti degli argomenti

In alcuni linguaggi, quali Visual C++ e Microsoft Visual Basic 2005, è supportata l'assegnazione di valori predefiniti agli argomenti. L'esempio riportato di seguito rappresenta una dichiarazione regolare di Visual Basic 2005 con valori predefiniti per due argomenti.

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

Per assegnare un valore predefinito a un parametro, è possibile utilizzare un attributo.

In Visual Basic e C++ i parametri possono essere omessi quando il metodo viene chiamato. In C# è necessario specificare i valori relativi agli argomenti facoltativi.

In tutti gli esempi seguenti, scritti in Visual Basic e C++, sono riportate chiamate valide di 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

Per recuperare il valore predefinito di un argomento tramite reflection, ottenere un oggetto ParameterInfo relativo al parametro, quindi recuperare il valore predefinito utilizzando la proprietà ParameterInfo.DefaultValue. Se non esiste alcun valore predefinito, la proprietà restituisce Value.DBNull.

Nell'esempio che segue vengono visualizzati nella console i valori predefiniti di 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);
}

Per richiamare i metodi che presentano argomenti con valori predefiniti, utilizzare Type.Missing come valore di parametro per il metodo InvokeMember. In tal modo il servizio di associazione tardiva può sostituire al valore di parametro indicato il valore predefinito. Se si passa Type.Missing per un parametro che non dispone di alcun valore predefinito, viene generata una ArgumentException. È importante tenere presente che non tutti i compilatori dispongono di meccanismi di associazione che rispettano queste regole per Type.Missing. È possibile che alcuni gestori di associazione non supportino tale funzionalità o considerino Type.Missing in modo diverso. Quando si utilizza Type.Missing non occorre specificare i valori predefiniti.

Il linguaggio C# non supporta gli argomenti predefiniti.

Nell'esempio Visual Basic 2005 riportato di seguito viene illustrato come utilizzare la reflection per richiamare metodi con argomenti predefiniti.

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

Quando si utilizza la tecnica sopra illustrata, gli argomenti predefiniti finali vengono considerati anche se il chiamante non specifica alcun valore. Si tratta del metodo più comune per richiamare metodi con argomenti predefiniti.

Se si richiama il metodo utilizzando MethodBase.Invoke, sarà necessario specificare in modo esplicito quali sono gli argomenti predefiniti, passando una matrice di oggetti contenente Type.Missing per tutti i parametri privi di valori.

Vedere anche

Riferimenti

Type.Missing

Reflection.Missing

MethodBase.Invoke

InvokeMember

Concetti

Visualizzazione delle informazioni sul tipo