System.Type.GetProperty 方法

本文提供此 API 參考文件的補充備註。

GetProperty(String) 方法

name搜尋會區分大小寫。 搜尋包含公用靜態和公用實例屬性。

如果屬性至少有一個存取子是公用的,則會將其視為公用。 否則,屬性會被視為私用屬性,而且您必須使用 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (在 Visual Basic 中,使用 結合 值 Or來取得它。

如果目前的 Type 代表建構的泛型型別,這個方法會傳回 PropertyInfo ,其型別參數會由適當的型別自變數所取代。

如果目前的 Type 代表泛型型別或泛型方法定義中的型別參數,這個方法會搜尋類別條件約束的屬性。

發生的情況 AmbiguousMatchException 包括下列各項:

  • 類型包含兩個具有相同名稱但不同參數數目的索引屬性。 若要解決模棱兩可的情況,請使用指定參數類型的方法多載 GetProperty
  • 衍生類型會宣告屬性,這個屬性會使用 new 修飾詞 (Shadows 在 Visual Basic 中)隱藏具有相同名稱的繼承屬性。 若要解決模棱兩可的情況,請使用 GetProperty(String, BindingFlags) 方法多載並新增 BindingFlags.DeclaredOnly 旗標,將搜尋限制為未繼承的成員。

GetProperty(String, BindingFlags) 方法

如果屬性至少有一個存取子是公用的,則會將其視為公用。 否則,屬性會被視為私用屬性,而且您必須使用 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (在 Visual Basic 中,使用 結合 值 Or來取得它。

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的屬性:

  • 您必須指定 BindingFlags.InstanceBindingFlags.Static ,才能取得傳回。
  • 指定 BindingFlags.Public 以在搜尋中包含公用屬性。
  • 指定 BindingFlags.NonPublic 以在搜尋中包含非公用屬性(也就是私用、內部和受保護的屬性)。
  • 指定要 BindingFlags.FlattenHierarchypublic 階層中包含和 protected 靜態成員; private 繼承類別中的靜態成員不包含在內。

下列 BindingFlags 修飾詞旗標可用來變更搜尋的運作方式:

  • BindingFlags.IgnoreCase 忽略的案例 name
  • BindingFlags.DeclaredOnly 表示只搜尋 在上 Type宣告的屬性,而不是只繼承的屬性。

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

如果目前的 Type 代表建構的泛型型別,這個方法會傳回 PropertyInfo ,其型別參數會由適當的型別自變數所取代。

如果目前的 Type 代表泛型型別或泛型方法定義中的型別參數,這個方法會搜尋類別條件約束的屬性。

發生的情況 AmbiguousMatchException 包括下列各項:

  • 類型包含兩個具有相同名稱但不同參數數目的索引屬性。 若要解決模棱兩可的情況,請使用指定參數類型的方法多載 GetProperty
  • 衍生類型會宣告屬性,這個屬性會使用 new 修飾詞 (Shadows 在 Visual Basic 中)隱藏具有相同名稱的繼承屬性。 若要解決模棱兩可的情況,請包含 BindingFlags.DeclaredOnly 以將搜尋限制為未繼承的成員。

GetProperty(System.String,System.反思離子。BindingFlags,System。反思。Binder,System.Type,System.Type[],System.反思。ParameterModifier[])

如果屬性至少有一個存取子是公用的,則會將其視為公用。 否則,屬性會被視為私用屬性,而且您必須使用 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (在 Visual Basic 中,使用 結合 值 Or來取得它。

雖然預設系結器不會處理 ParameterModifiermodifiers 參數),但您可以使用抽象 System.Reflection.Binder 類來撰寫會處理 modifiers的自定義系結器。 ParameterModifier 只有在透過 COM Interop 呼叫,而且只會處理以傳址方式傳遞的參數時使用。

下表顯示基類的成員在反映類型時,方法會 Get 傳回哪些成員。

成員類型 Static 非靜態
建構函式 No
欄位 No 是。 欄位一律為依名稱和簽章隱藏。
Event 不適用 常見的類型系統規則是繼承與實作 屬性的方法相同。 反思 ion 會將屬性視為 hide-by-name-and-signature。2
方法 No 是。 方法(虛擬和非虛擬)可以是依名稱隱藏或依名稱和簽章隱藏。
巢狀類型 No No
屬性 不適用 常見的類型系統規則是繼承與實作 屬性的方法相同。 反思 ion 會將屬性視為 hide-by-name-and-signature。2

注意:

  1. 依名稱和簽章隱藏會考慮簽章的所有部分,包括自定義修飾詞、傳回類型、參數類型、sentinels 和 Unmanaged 呼叫慣例。 這是二進位比較。
  2. 針對反映,屬性和事件是依名稱與簽章隱藏。 如果您的屬性在基類中同時具有 get 和 set 存取子,但衍生類別只有 get 存取子,衍生類別屬性會隱藏基類屬性,而且您將無法存取基類上的 setter。
  3. 自訂屬性不是一般類型系統的一部分。

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的屬性:

  • 您必須指定 BindingFlags.InstanceBindingFlags.Static ,才能取得傳回。
  • 指定 BindingFlags.Public 以在搜尋中包含公用屬性。
  • 指定 BindingFlags.NonPublic 以在搜尋中包含非公用屬性(也就是私用、內部和受保護的屬性)。
  • 指定要 BindingFlags.FlattenHierarchypublic 階層中包含和 protected 靜態成員; private 繼承類別中的靜態成員不包含在內。

下列 BindingFlags 修飾詞旗標可用來變更搜尋的運作方式:

  • BindingFlags.IgnoreCase 忽略的案例 name
  • BindingFlags.DeclaredOnly 表示只搜尋 在上 Type宣告的屬性,而不是只繼承的屬性。

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

如果目前的 Type 代表建構的泛型型別,這個方法會傳回 PropertyInfo ,其型別參數會由適當的型別自變數所取代。

如果目前的 Type 代表泛型型別或泛型方法定義中的型別參數,這個方法會搜尋類別條件約束的屬性。

索引器和預設屬性

Visual Basic、C# 和 C++ 已簡化語法來存取索引屬性,並允許一個索引屬性為其類型預設值。 例如,如果變數 myList 參考 ArrayList,則語法 myList[3]myList(3) 在 Visual Basic 中) 會擷取索引為 3 的專案。 您可以多載 屬性。

在 C# 中,這項功能稱為索引器,無法依名稱參照。 根據預設,C# 索引器會在元數據中顯示為名為 的 Item索引屬性。 不過,類別庫開發人員可以使用 IndexerNameAttribute 屬性來變更元數據中的索引器名稱。 例如,類別 String 具有名為的 Chars[]索引器。 使用 C# 以外的語言所建立的索引屬性也可以具有 以外的 Item名稱。

若要判斷類型是否具有預設屬性,請使用 GetCustomAttributes(Type, Boolean) 方法來測試 DefaultMemberAttribute 屬性。 如果類型具有 DefaultMemberAttribute,則 MemberName 屬性會傳回預設屬性的名稱。