通过


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

GetConstructors由于重载仅Public使用并且Instance静态构造函数既不由for表达式计算,也不由表达式计算。IsStatic

若要查找静态构造函数,请使用GetConstructors重载,并将其传递给 的组合BindingFlags.NonPublicBindingFlags.PublicBindingFlags.StaticBindingFlags.Instance(逻辑 OR),如以下代码示例所示:

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

Source:
Type.cs
Source:
Type.cs
Source:
Type.cs
Source:
Type.cs
Source:
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()

返回

表示为当前Type定义但不包括类型初始值设定项(静态构造函数)的所有公共实例构造函数的对象数组ConstructorInfo。 如果未为当前 Type定义公共实例构造函数,或者当前 Type 函数在泛型类型或泛型方法的定义中表示类型参数,则返回一个类型空 ConstructorInfo 数组。

实现

属性

注解

在 .NET 6 和早期版本中,该方法 GetConstructors 不按特定顺序返回构造函数,例如声明顺序。 代码不得依赖于返回构造函数的顺序,因为该顺序会有所不同。 但是,从 .NET 7 开始,排序是基于程序集中的元数据排序确定性的。

下表显示了通过 Get 方法在反射类型时返回的基类成员。

成员类型 Static 非静态
构造函数
领域 是的。 字段始终是按名称和签名隐藏的。
事件 不適用 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。
方法 是的。 方法(虚拟和非虚拟)可以按名称隐藏或按名称和签名隐藏。
嵌套类型
财产 不適用 常见的类型系统规则是继承与实现属性的方法相同。 反射将属性视为按名称和签名隐藏。 请参阅下面的说明 2。
  1. 按名称和签名隐藏会考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinel 和非托管调用约定。 这是二进制比较。

  2. 对于反射,属性和事件通过名称和签名进行隐藏。 如果基类中同时具有 get 和 set 访问器的属性,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且无法访问基类上的 setter。

  3. 自定义属性不是常见类型系统的一部分。

此方法重载调用GetConstructors(BindingFlags)方法重载(BindingFlags.PublicBindingFlags.InstanceBindingFlags.Public | BindingFlags.InstanceOr在 Visual Basic 中)。 它找不到类初始值设定项(静态构造函数)。 若要查找类初始值设定项,请使用采用BindingFlags和指定(BindingFlags.StaticBindingFlags.NonPublicOr在 Visual Basic 中)BindingFlags.Static | BindingFlags.NonPublic的重载。 还可以使用 TypeInitializer 属性获取类初始值设定项。

如果当前 Type 表示构造的泛型类型,此方法将返回 ConstructorInfo 具有由相应类型参数替换的类型参数的对象。 例如,如果类C<T>有一个构造函数(Sub New(ByVal t1 As T)在 Visual Basic 中),则调用GetConstructors返回C<int>一个ConstructorInfo在 C# 中表示C(int t1)的构造函数C(T t1)Sub New(ByVal t1 As Integer)在 Visual Basic 中)。

如果当前 Type 表示泛型类型参数,该方法 GetConstructors 将返回空数组。

另请参阅

适用于

GetConstructors(BindingFlags)

Source:
Type.cs
Source:
Type.cs
Source:
Type.cs
Source:
Type.cs
Source:
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 定义的所有构造函数,包括类型初始值设定项(如果已定义)。 如果没有为当前Type构造函数定义任何构造函数,则返回一个空数组ConstructorInfo,如果未定义构造函数与绑定约束匹配,或者当前Type在泛型类型或泛型方法的定义中表示类型参数。

实现

属性

注解

bindingAttr 可用于指定是仅返回公共构造函数还是同时返回公共和非公共构造函数。

以下 BindingFlags 筛选器标志可用于定义要在搜索中包含哪些构造函数:

  • 指定 BindingFlags.StaticBindingFlags.NonPublic 检索类初始值设定项(静态构造函数)。 还可以使用 TypeInitializer 属性获取类初始值设定项。

  • 与一个或两者BindingFlags.Public一起指定BindingFlags.InstanceBindingFlags.NonPublic检索实例构造函数。

有关详细信息,请参阅 System.Reflection.BindingFlags

在 .NET 6 和早期版本中,该方法 GetConstructors 不按特定顺序返回构造函数,例如声明顺序。 代码不得依赖于返回构造函数的顺序,因为该顺序会有所不同。 但是,从 .NET 7 开始,排序是基于程序集中的元数据排序确定性的。

如果当前 Type 表示构造的泛型类型,此方法将返回 ConstructorInfo 具有由相应类型参数替换的类型参数的对象。 例如,如果类C<T>有一个构造函数(Sub New(ByVal t1 As T)在 Visual Basic 中),则调用GetConstructors返回C<int>一个ConstructorInfo在 C# 中表示C(int t1)的构造函数C(T t1)Sub New(ByVal t1 As Integer)在 Visual Basic 中)。

如果当前 Type 表示泛型类型参数,该方法 GetConstructors 将返回空数组。

另请参阅

适用于