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,所以靜態建構函式不會由表達式計算,也不會由 forIsStatic評估。

若要尋找靜態建構函式,請使用 GetConstructors 多載,並將組合傳遞 (、BindingFlags.StaticBindingFlags.NonPublicBindingFlags.Instance的邏輯 OR) BindingFlags.Public,如下列程式代碼範例所示:

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 的公用建構函式。

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 傳回的基類成員。

成員類型 Static 非靜態
建構函式
欄位 可以。 欄位一律會依名稱與簽章隱藏。
事件 不適用 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附註 2。
方法 可以。 (虛擬和非虛擬) 的方法可以是依名稱隱藏或依名稱隱藏和簽章。
巢狀類型
屬性 不適用 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附註 2。
  1. 依名稱與簽章隱藏會考慮簽章的所有部分,包括自定義修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。

  2. 針對反映,屬性和事件會依名稱與簽章隱藏。 如果您的屬性同時具有基類中的 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法在基類上存取 setter。

  3. 自訂屬性不是通用類型系統的一部分。

這個方法多載會GetConstructors(BindingFlags)呼叫 方法多載,並在BindingFlags.Instance | BindingFlags.PublicVisual Basic) 中使用 (。BindingFlags.PublicOrBindingFlags.Instance 在靜態建構函式 (找不到類別初始化表達式) 。 若要尋找類別初始化表達式,請使用採用 BindingFlags的多載,並在Visual Basic) 中指定BindingFlags.Static | BindingFlags.NonPublic (。BindingFlags.StaticOrBindingFlags.NonPublic 您也可以使用 TypeInitializer 屬性取得類別初始化運算式。

如果目前的 Type 表示已建構的泛型型別,這個方法會傳回 ConstructorInfo 物件,其型別參數會由適當的型別自變數所取代。 例如,如果 類別C<T>在 Visual Basic) 中有建Sub New(ByVal t1 As T)C(T t1)函式 (,則呼叫 GetConstructorsC<int>傳回ConstructorInfo在 Visual Basic) 中以 C# (Sub New(ByVal t1 As Integer) 表示C(int t1)的 。

如果目前的 Type 表示泛型型別參數,則方法會 GetConstructors 傳回空數位列。

另請參閱

適用於

GetConstructors(BindingFlags)

在衍生類別中覆寫時,使用指定的 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

傳回

對象的陣列,表示針對符合指定系結條件約束之目前Type所定義之所有建構函式的建ConstructorInfo構函式,包括定義時的類型初始化表達式。 如果目前的 ConstructorInfo 沒有定義建構函式,或所定義的建構函式都不符合繫結條件約束,或目前的 Type 表示泛型類型或泛型方法定義中的類型參數,則傳回 Type 類型的空陣列。

實作

屬性

備註

bindingAttr 可用來指定只傳回公用建構函式,還是傳回公用和非公用建構函式。

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的建構函式:

  • 指定 BindingFlags.StaticBindingFlags.NonPublic ,以擷取靜態建構函式) (類別初始化表達式。 您也可以使用 TypeInitializer 屬性取得類別初始化運算式。

  • BindingFlags.Instance指定 和 的一或兩者BindingFlags.PublicBindingFlags.NonPublic,以擷取實例建構函式。

如需相關資訊,請參閱 System.Reflection.BindingFlags

在 .NET 6 和舊版中 GetConstructors ,方法不會以特定順序傳回建構函式,例如宣告順序。 您的程式代碼不得取決於傳回建構函式的順序,因為順序會有所不同。 不過,從 .NET 7 開始,根據元件中的元數據排序,排序是具決定性的。

如果目前的 Type 表示已建構的泛型型別,這個方法會傳回 ConstructorInfo 物件,其型別參數會由適當的型別自變數所取代。 例如,如果 類別C<T>在 Visual Basic) 中有建Sub New(ByVal t1 As T)C(T t1)函式 (,則呼叫 GetConstructorsC<int>傳回ConstructorInfo在 Visual Basic) 中以 C# (Sub New(ByVal t1 As Integer) 表示C(int t1)的 。

如果目前的 Type 表示泛型型別參數,則方法會 GetConstructors 傳回空數位列。

另請參閱

適用於