Type.GetConstructors 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得目前 Type 的建構函式。
多載
GetConstructors() |
傳回所有定義給目前 Type 的公用建構函式。 |
GetConstructors(BindingFlags) |
在衍生類別中覆寫時,使用指定的 Type,搜尋定義給目前 |
範例
此範例顯示類別中具有兩個實例建構函式和一個靜態建構函式的多 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.Static、 BindingFlags.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.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
傳回的基類成員。
成員類型 | Static | 非靜態 |
---|---|---|
建構函式 | 否 | 否 |
欄位 | 否 | 可以。 欄位一律會依名稱與簽章隱藏。 |
事件 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附註 2。 |
方法 | 否 | 可以。 (虛擬和非虛擬) 的方法可以是依名稱隱藏或依名稱隱藏和簽章。 |
巢狀類型 | 否 | 否 |
屬性 | 不適用 | 常見的型別系統規則是繼承與實作 屬性的方法相同。 反映會將屬性視為 hide-by-name-and-signature。 請參閱下面的附註 2。 |
依名稱與簽章隱藏會考慮簽章的所有部分,包括自定義修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。
針對反映,屬性和事件會依名稱與簽章隱藏。 如果您的屬性同時具有基類中的 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法在基類上存取 setter。
自訂屬性不是通用類型系統的一部分。
這個方法多載會GetConstructors(BindingFlags)呼叫 方法多載,並在BindingFlags.Instance | BindingFlags.PublicVisual Basic) 中使用 (。BindingFlags.PublicOr
BindingFlags.Instance 在靜態建構函式 (找不到類別初始化表達式) 。 若要尋找類別初始化表達式,請使用採用 BindingFlags的多載,並在Visual Basic) 中指定BindingFlags.Static | BindingFlags.NonPublic (。BindingFlags.StaticOr
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 傳回空數位列。
另請參閱
- ConstructorInfo
- GetConstructor(BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])
適用於
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()
參數
傳回
對象的陣列,表示針對符合指定系結條件約束之目前Type所定義之所有建構函式的建ConstructorInfo構函式,包括定義時的類型初始化表達式。 如果目前的 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>
在 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 傳回空數位列。
另請參閱
- ConstructorInfo
- BindingFlags
- DefaultBinder
- GetConstructor(BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])