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


Type.GetConstructors Метод

Определение

Возвращает конструкторы текущего Typeобъекта.

Перегрузки

Имя Описание
GetConstructors()

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

GetConstructors(BindingFlags)

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

Примеры

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

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

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

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

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.cs
Исходный код:
Type.cs

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

public:
 cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors();
public:
 virtual cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors();
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
public System.Reflection.ConstructorInfo[] GetConstructors();
public System.Reflection.ConstructorInfo[] GetConstructors();
[System.Runtime.InteropServices.ComVisible(true)]
public System.Reflection.ConstructorInfo[] GetConstructors();
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)>]
member this.GetConstructors : unit -> System.Reflection.ConstructorInfo[]
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 методами при отражении типа.

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

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

  3. Пользовательские атрибуты не являются частью общей системы типов.

Эта перегрузка метода вызывает перегрузку GetConstructors(BindingFlags) метода ( BindingFlags.PublicBindingFlags.Instance | BindingFlags.InstanceBindingFlags.PublicOrв 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), вызов GetConstructorsC<int> возвращает возвращаемое ConstructorInfoC(int t1) значение в C# (Sub New(ByVal t1 As Integer) в Visual Basic).

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

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

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

GetConstructors(BindingFlags)

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

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

public:
 abstract cli::array <System::Reflection::ConstructorInfo ^> ^ GetConstructors(System::Reflection::BindingFlags bindingAttr);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
public abstract 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);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)>]
abstract member GetConstructors : System.Reflection.BindingFlags -> System.Reflection.ConstructorInfo[]
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.NonPublicBindingFlags.Public конструкторами экземпляров.

См. System.Reflection.BindingFlags для получения дополнительной информации.

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

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

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

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

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