Partilhar via


Type.GetConstructors Método

Definição

Obtém os construtores do Type atual.

Sobrecargas

GetConstructors()

Retorna todos os construtores públicos definidos para o Type atual.

GetConstructors(BindingFlags)

Quando substituído em uma classe derivada, pesquisa os construtores definidos para o Type atual usando os BindingFlags especificados.

Exemplos

Este exemplo mostra a saída da GetConstructors() sobrecarga de uma classe que tem dois construtores de instância e um construtor estático.

using namespace System;
using namespace System::Reflection;
public ref class t
{
public:
   t(){}

   static t(){}

   t( int /*i*/ ){}

};

int main()
{
   array<ConstructorInfo^>^p = t::typeid->GetConstructors();
   Console::WriteLine( p->Length );
   for ( int i = 0; i < p->Length; i++ )
   {
      Console::WriteLine( p[ i ]->IsStatic );

   }
}
using System;
using System.Reflection;

public class t {
    public t() {}
    static t() {}
    public t(int i) {}

    public static void Main() {
        ConstructorInfo[] p = typeof(t).GetConstructors();
        Console.WriteLine(p.Length);

        for (int i=0;i<p.Length;i++) {
            Console.WriteLine(p[i].IsStatic);
        }
    }
}
type t() =
    static do ()
    new(i: int) = t ()

let p = typeof<t>.GetConstructors()
printfn $"{p.Length}"

for c in p do
    printfn $"{c.IsStatic}"
Imports System.Reflection

Public Class t
    
    Public Sub New()
    End Sub
    
    Shared Sub New()
    End Sub
    
    Public Sub New(i As Integer)
    End Sub
     
    Public Shared Sub Main()
        Dim p As ConstructorInfo() = GetType(t).GetConstructors()
        Console.WriteLine(p.Length)
        
        Dim i As Integer
        For i = 0 To p.Length - 1
            Console.WriteLine(p(i).IsStatic)
        Next i
    End Sub
End Class

A saída desse código é:

2
False
False

Como a GetConstructors sobrecarga usa apenas Public e Instance, o construtor estático não é contado pela for expressão nem avaliado por IsStatic.

Para localizar construtores estáticos, use a GetConstructors sobrecarga e passe a combinação (OR lógico) de BindingFlags.Public, BindingFlags.Static, BindingFlags.NonPublic, BindingFlags.Instance, conforme mostrado no exemplo de código a seguir:

using namespace System;
using namespace System::Reflection;
public ref class t
{
public:
   t(){}

   t( int /*i*/ ){}

   static t(){}

};

int main()
{
   array<ConstructorInfo^>^p = t::typeid->GetConstructors( static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Static | BindingFlags::NonPublic | BindingFlags::Instance) );
   Console::WriteLine( p->Length );
   for ( int i = 0; i < p->Length; i++ )
   {
      Console::WriteLine( p[ i ]->IsStatic );
   }
}
using System;
using System.Reflection;

public class t {
    public t() {}
    static t() {}
    public t(int i) {}

    public static void Main() {
        ConstructorInfo[] p = typeof(t).GetConstructors(
           BindingFlags.Public | BindingFlags.Static |
           BindingFlags.NonPublic | BindingFlags.Instance);
        Console.WriteLine(p.Length);

        for (int i=0;i<p.Length;i++) {
            Console.WriteLine(p[i].IsStatic);
        }
    }
}
open System.Reflection

type t() =
    static do ()
    new (i: int) = t ()

let p = typeof<t>.GetConstructors(BindingFlags.Public ||| BindingFlags.Static ||| BindingFlags.NonPublic ||| BindingFlags.Instance)
printfn $"{p.Length}"

for c in p do
    printfn $"{c.IsStatic}"
Imports System.Reflection

Public Class t
    
    Public Sub New()
    End Sub
    
    Shared Sub New()
    End Sub
    
    Public Sub New(i As Integer)
    End Sub
     
    Public Shared Sub Main()
        Dim p As ConstructorInfo() = GetType(T).GetConstructors( _
           BindingFlags.Public Or _
           BindingFlags.Static Or _
           BindingFlags.NonPublic Or _
           BindingFlags.Instance)
        Console.WriteLine(p.Length)
        
        Dim i As Integer
        For i = 0 To p.Length - 1
            Console.WriteLine(p(i).IsStatic)
        Next i
    End Sub
End Class

Agora a saída é:

3
False
True
False

GetConstructors()

Origem:
Type.cs
Origem:
Type.cs
Origem:
Type.cs

Retorna todos os construtores públicos definidos para o Type atual.

public:
 cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors();
public:
 virtual cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors();
public System.Reflection.ConstructorInfo[] GetConstructors ();
[System.Runtime.InteropServices.ComVisible(true)]
public System.Reflection.ConstructorInfo[] GetConstructors ();
member this.GetConstructors : unit -> System.Reflection.ConstructorInfo[]
abstract member GetConstructors : unit -> System.Reflection.ConstructorInfo[]
override this.GetConstructors : unit -> System.Reflection.ConstructorInfo[]
[<System.Runtime.InteropServices.ComVisible(true)>]
abstract member GetConstructors : unit -> System.Reflection.ConstructorInfo[]
override this.GetConstructors : unit -> System.Reflection.ConstructorInfo[]
Public Function GetConstructors () As ConstructorInfo()

Retornos

Uma matriz de objetos ConstructorInfo que representa todos os construtores de instância pública definidos para o Type atual, mas não incluindo o inicializador de tipo (construtor estático). Se nenhum construtor de instância pública for definido para o Type atual ou se o Type atual representar um parâmetro de tipo na definição de um tipo ou método genérico, uma matriz vazia do tipo ConstructorInfo será retornada.

Implementações

Atributos

Comentários

No .NET 6 e em versões anteriores, o GetConstructors método não retorna construtores em uma ordem específica, como a ordem de declaração. Seu código não deve depender da ordem em que os construtores são retornados, pois essa ordem varia. No entanto, a partir do .NET 7, a ordenação é determinística com base na ordenação de metadados no assembly.

A tabela a seguir mostra quais membros de uma classe base são retornados pelos métodos Get durante a reflexão em um tipo.

Tipo do membro Estático Não estático
Construtor Não Não
Campo Não Sim. Um campo permanece sempre oculto por nome e assinatura.
Evento Não aplicável A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. Reflexão trata propriedades como ocultas por nome e assinatura. Consulte a observação 2 abaixo.
Método Não Sim. Um método (virtual e não virtual) pode permanecer oculto por nome ou por nome e assinatura.
Tipo aninhado Não Não
Propriedade Não aplicável A regra de sistema do tipo comum é que a herança é a mesma dos métodos que implementam a propriedade. Reflexão trata propriedades como ocultas por nome e assinatura. Consulte a observação 2 abaixo.
  1. Oculto por nome e assinatura considera todas as partes da assinatura, inclusive modificadores personalizados, tipos de retorno, tipos de parâmetro, sentinelas e convenções de chamada não gerenciadas. Esta é uma comparação binária.

  2. Para reflexão, propriedades e eventos permanecem ocultos por nome e assinatura. Se você tiver uma propriedade com um acessador get e set na classe base, mas a classe derivada tiver apenas um acessador get, a propriedade de classe derivada ocultará a propriedade da classe base e você não poderá acessar o setter na classe base.

  3. Atributos personalizados não fazem parte do sistema de tipo comum.

Essa sobrecarga de método chama a sobrecarga do GetConstructors(BindingFlags) método, com BindingFlags.PublicBindingFlags.Instance | (BindingFlags.PublicOrBindingFlags.Instance no Visual Basic). Ele não encontrará inicializadores de classe (construtor estático). Para localizar inicializadores de classe, use uma sobrecarga que usa BindingFlagse especifique | BindingFlags.NonPublicBindingFlags.Static(BindingFlags.StaticOrBindingFlags.NonPublic no Visual Basic). Também é possível obter o inicializador da classe usando-se a propriedade TypeInitializer.

Se o atual Type representar um tipo genérico construído, esse método retornará os ConstructorInfo objetos com os parâmetros de tipo substituídos pelos argumentos de tipo apropriados. Por exemplo, se a classe C<T> tiver um construtor C(T t1) (Sub New(ByVal t1 As T) no Visual Basic), chamar GetConstructors em C<int> retornará um ConstructorInfo que representa C(int t1) em C# (Sub New(ByVal t1 As Integer) no Visual Basic).

Se o atual Type representar um parâmetro de tipo genérico, o GetConstructors método retornará uma matriz vazia.

Confira também

Aplica-se a

GetConstructors(BindingFlags)

Origem:
Type.cs
Origem:
Type.cs
Origem:
Type.cs

Quando substituído em uma classe derivada, pesquisa os construtores definidos para o Type atual usando os BindingFlags especificados.

public:
 abstract cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors(System::Reflection::BindingFlags bindingAttr);
public abstract System.Reflection.ConstructorInfo[] GetConstructors (System.Reflection.BindingFlags bindingAttr);
[System.Runtime.InteropServices.ComVisible(true)]
public abstract System.Reflection.ConstructorInfo[] GetConstructors (System.Reflection.BindingFlags bindingAttr);
abstract member GetConstructors : System.Reflection.BindingFlags -> System.Reflection.ConstructorInfo[]
[<System.Runtime.InteropServices.ComVisible(true)>]
abstract member GetConstructors : System.Reflection.BindingFlags -> System.Reflection.ConstructorInfo[]
Public MustOverride Function GetConstructors (bindingAttr As BindingFlags) As ConstructorInfo()

Parâmetros

bindingAttr
BindingFlags

Uma combinação bit a bit dos valores de enumeração que especificam como a pesquisa é realizada.

- ou -

Default para retornar uma matriz vazia.

Retornos

Uma matriz de ConstructorInfo objetos que representam todos os construtores definidos para o atual Type que correspondem às restrições de associação especificadas, incluindo o inicializador de tipo, se ele estiver definido. Retorna uma matriz vazia do tipo ConstructorInfo se nenhum construtor estiver definido para o Type atual, se nenhum dos construtores definidos corresponderem às restrições de associação ou se o Type atual representar um parâmetro de tipo na definição de um tipo genérico ou método genérico.

Implementações

Atributos

Comentários

bindingAttr pode ser usado para especificar se deseja retornar apenas construtores públicos ou construtores públicos e não públicos.

Os seguintes sinalizadores de filtro BindingFlags podem ser usados para definir quais construtores devem ser incluídos na pesquisa:

  • Especifique BindingFlags.Static junto com BindingFlags.NonPublic para recuperar o inicializador de classe (construtor estático). Também é possível obter o inicializador da classe usando-se a propriedade TypeInitializer.

  • Especifique BindingFlags.Instance junto com um ou ambos e BindingFlags.PublicBindingFlags.NonPublic para recuperar construtores de instância.

Consulte System.Reflection.BindingFlags para obter mais informações.

No .NET 6 e em versões anteriores, o GetConstructors método não retorna construtores em uma ordem específica, como a ordem de declaração. Seu código não deve depender da ordem em que os construtores são retornados, pois essa ordem varia. No entanto, a partir do .NET 7, a ordenação é determinística com base na ordenação de metadados no assembly.

Se o atual Type representar um tipo genérico construído, esse método retornará os ConstructorInfo objetos com os parâmetros de tipo substituídos pelos argumentos de tipo apropriados. Por exemplo, se a classe C<T> tiver um construtor C(T t1) (Sub New(ByVal t1 As T) no Visual Basic), chamar GetConstructors em C<int> retornará um ConstructorInfo que representa C(int t1) em C# (Sub New(ByVal t1 As Integer) no Visual Basic).

Se o atual Type representar um parâmetro de tipo genérico, o GetConstructors método retornará uma matriz vazia.

Confira também

Aplica-se a