Поделиться через


Type.GetConstructors Метод

Определение

Получает конструкторы текущего объекта Type.

Перегрузки

GetConstructors()

Возвращает все открытые конструкторы, определенные для текущего объекта Type.

GetConstructors(BindingFlags)

При переопределении в производном классе ищет конструкторы, определенные для текущего объекта Type, с использованием указанного объекта BindingFlags.

Примеры

В этом примере показаны выходные данные перегрузки GetConstructors() класса с двумя конструкторами экземпляров и одним статическим конструктором.

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

Выходные данные этого кода:

2
False
False

Так как перегрузка GetConstructors использует только Public и Instance, статический конструктор не учитывается выражением for и не вычисляется .IsStatic

Чтобы найти статические конструкторы, используйте перегрузку GetConstructors и передайте ей сочетание (логическое ИЛИ) BindingFlags.Public, BindingFlags.Static, BindingFlags.NonPublic, BindingFlags.Instanceкак показано в следующем примере кода:

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

Теперь выходные данные:

3
False
True
False

GetConstructors()

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

Возвращает все открытые конструкторы, определенные для текущего объекта Type.

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()

Возвращаемое значение

Массив объектов ConstructorInfo, представляющий все открытые конструкторы экземпляров, определенные для текущего типа Type, за исключением инициализатора типа (статический конструктор). Если для текущего объекта Type открытые конструкторы экземпляров не определены или если текущий объект Type представляет параметр типа в определении универсального типа или метода, возвращается пустой массив типа ConstructorInfo.

Реализации

Атрибуты

Комментарии

В .NET 6 и более ранних версиях GetConstructors метод не возвращает конструкторы в определенном порядке, например в порядке объявления. Код не должен зависеть от порядка, в котором возвращаются конструкторы, так как этот порядок отличается. Однако, начиная с .NET 7, порядок детерминирован на основе порядка метаданных в сборке.

В следующей таблице показано, какие члены базового класса возвращаются методами Get при отражении в типе.

Тип члена Статические Нестатическое
Конструктор Нет Нет
Поле Нет Да. Поле всегда имеет значение hide-by-name-and-signature.
Событие Неприменимо Общее правило системы типов состоит в том, что наследование совпадает с наследованием методов, реализующих свойство . Отражение рассматривает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже.
Метод Нет Да. Метод (как виртуальный, так и не виртуальный) может иметь значение hide-by-name или hide-by-name-and-signature.
Вложенный тип Нет Нет
Свойство. Неприменимо Общее правило системы типов состоит в том, что наследование совпадает с наследованием методов, реализующих свойство . Отражение рассматривает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже.
  1. Функция скрытия по имени и подписи учитывает все части сигнатуры, включая пользовательские модификаторы, типы возвращаемых значений, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.

  2. Для отражения свойства и события представляют собой скрытие по имени и сигнатуре. Если у вас есть свойство с методом доступа get и set в базовом классе, но производный класс имеет только метод доступа get, свойство производного класса скрывает свойство базового класса, и вы не сможете получить доступ к методу задания в базовом классе.

  3. Настраиваемые атрибуты не являются частью системы общих типов.

Эта перегрузка метода вызывает перегрузку GetConstructors(BindingFlags) метода с BindingFlags.PublicBindingFlags.Instance | (BindingFlags.PublicOrBindingFlags.Instance в Visual Basic). Он не будет находить инициализаторы класса (статический конструктор). Чтобы найти инициализаторы класса, используйте перегрузку, которая принимает BindingFlags, и укажите | BindingFlags.NonPublicBindingFlags.Static(BindingFlags.StaticOrBindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .

Если текущий Type представляет сконструированный универсальный тип, этот метод возвращает ConstructorInfo объекты с параметрами типа, замененными соответствующими аргументами типа. Например, если класс C<T> имеет конструктор C(T t1) (Sub New(ByVal t1 As T) в Visual Basic), вызов C<int>GetConstructors метода возвращает ConstructorInfo объект , представляющий C(int t1) в C# (Sub New(ByVal t1 As Integer) в Visual Basic).

Если текущий Type объект представляет параметр универсального GetConstructors типа, метод возвращает пустой массив.

См. также раздел

Применяется к

GetConstructors(BindingFlags)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

При переопределении в производном классе ищет конструкторы, определенные для текущего объекта Type, с использованием указанного объекта BindingFlags.

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()

Параметры

bindingAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающих способ проведения поиска.

-или-

Default для возврата пустого массива.

Возвращаемое значение

Массив объектов , ConstructorInfo представляющих все конструкторы, определенные для текущего Type объекта , которые соответствуют указанным ограничениям привязки, включая инициализатор типа, если он определен. Возвращает пустой массив типа ConstructorInfo, если для текущего типа Type не определены конструкторы, если ни один из определенных конструкторов не соответствует ограничениям привязки или если текущий тип Type представляет параметр типа в определении универсального типа или метода.

Реализации

Атрибуты

Комментарии

bindingAttr может использоваться для указания того, следует ли возвращать только открытые конструкторы или открытые и не являющиеся открытыми конструкторы.

BindingFlags Следующие флаги фильтра можно использовать для определения конструкторов, которые следует включить в поиск:

  • Укажите BindingFlags.Static вместе с BindingFlags.NonPublic , чтобы получить инициализатор класса (статический конструктор). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .

  • Укажите BindingFlags.Instance вместе с одним или обоими из BindingFlags.Public и BindingFlags.NonPublic , чтобы получить конструкторы экземпляров.

Дополнительные сведения см. в разделе System.Reflection.BindingFlags.

В .NET 6 и более ранних версиях GetConstructors метод не возвращает конструкторы в определенном порядке, например в порядке объявления. Код не должен зависеть от порядка, в котором возвращаются конструкторы, так как этот порядок отличается. Однако, начиная с .NET 7, порядок детерминирован на основе порядка метаданных в сборке.

Если текущий Type представляет сконструированный универсальный тип, этот метод возвращает ConstructorInfo объекты с параметрами типа, замененными соответствующими аргументами типа. Например, если класс C<T> имеет конструктор C(T t1) (Sub New(ByVal t1 As T) в Visual Basic), вызов C<int>GetConstructors метода возвращает ConstructorInfo объект , представляющий C(int t1) в C# (Sub New(ByVal t1 As Integer) в Visual Basic).

Если текущий Type объект представляет параметр универсального GetConstructors типа, метод возвращает пустой массив.

См. также раздел

Применяется к