Acessando os valores do argumento padrão

Algumas linguagens (sistema autônomo o Visual C++ e Microsoft Visual Basic 2005) oferecem suporte a atribuição de valores padrão aos argumentos. Por exemplo, a seguir é um legítimos Visual Basic 2005 declaração apresenta valores padrão para dois dos argumentos.

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

Você pode usar um atributo de parâmetro para atribuir um valor de parâmetro padrão.

No Visual Basic e C++, parâmetros opcionais podem ser omitidos quando o método é chamado.Em translation from VPE for Csharp valores devem ser especificados para argumentos opcionais.

Por exemplo, todos os exemplos a seguir do Visual Basic e C++ são chamadas válidas para 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

Para recuperar o valor padrão de um argumento usando reflexão, obtenha um ParameterInfo objeto para o parâmetro e recuperar o valor padrão usando o ParameterInfo.DefaultValue propriedade. Se não houver nenhum valor padrão, a propriedade retornará Value.DBNull.

O exemplo a seguir exibe os valores padrão de MyMethod no console.

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

Para chamar sistema autônomo métodos que possuem argumentos com valores padrão, use Type.Missing sistema autônomo um valor de parâmetro para o InvokeMember método. Isso permite que o serviço de ligação tardia usar o valor padrão para o valor do parâmetro indicado.If Type.Missing é passado para um parâmetro não tem valor padrão, um ArgumentException é lançada. É importante observar que mecanismos de ligação compiladores de nem todos os podem respeitam essas regras para Type.Missing.Alguns fichários talvez não suporte essa funcionalidade, ou podem tratar Type.Missing diferente.Ao usar Type.Missing, os valores padrão não precisa estar à direita.

O linguagem translation from VPE for Csharp não suporta argumentos padrão.

A seguir Visual Basic 2005 exemplo mostra como usar reflexão para invocar os métodos que possuem argumentos padrão.

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

Ao usar a técnica anterior, argumentos padrão finais são considerados mesmo quando o chamador não especificar nenhum valor.Esta é a maneira mais comum para chamar métodos com argumentos padrão.

Se você estiver usando MethodBase.Invoke para chamar o método, você precisa especificar explicitamente quais argumentos são os padrões, transmitindo uma matriz objeto que contém Type.Missing para todos os parâmetros que não tenham valores.

Consulte também

Conceitos

Exibindo informações de tipo

Referência

Type.Missing

reflexão.Missing

MethodBase.Invoke

InvokeMember