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.NonPublicBindingFlags.PublicBindingFlags.StaticBindingFlags.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()

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();
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 的基类成员。

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

  2. 为了反射,属性和事件是按名称和签名隐藏的。 如果基类中有一个同时具有 get 和 set 访问器的属性,但派生类只有一个 get 访问器,则派生类属性将隐藏基类属性,并且你将无法访问基类上的 setter。

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

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

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

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

另请参阅

适用于

GetConstructors(BindingFlags)

Source:
Type.cs
Source:
Type.cs
Source:
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.StaticBindingFlags.NonPublic 以检索类初始值设定项 (静态构造函数) 。 还可以使用 TypeInitializer 属性获取类初始值设定项。

  • 指定 BindingFlags.InstanceBindingFlags.NonPublicBindingFlags.Public一个或两者,以检索实例构造函数。

有关更多信息,请参见System.Reflection.BindingFlags

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

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

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

另请参阅

适用于